ssh + sudo + su ke shell login

11

Saya memiliki beberapa mesin yang saya ssh secara teratur hanya untuk tujuan menggunakan sudo sumenghabiskan sisa sesi saya login sebagai beberapa pengguna tujuan khusus. Alur kerja umum adalah:

mymachine:~ me$ ssh me@othermachine
othermachine:~ me$ sudo su - specialuser # note: no password needed
othermachine:~ specialuser$ # do stuff

Saya ingin merebus ini menjadi satu-liner yang saya bisa alias, jadi saya bisa mengatur alias untuk setiap mesin dan sampai ke tempat saya perlu dalam satu perintah, tanpa harus mengetikkan sudo su - specialuserboilerplate. Saya mungkin dapat mengatur me@othermachineuntuk sudo sumasuk, tetapi saya ingin menjaga fleksibilitas untuk beroperasi seolah- meolah saya perlu.

( Catatan: Saya tidak memiliki kendali atas othermachineatau cara pengaturannya; ini adalah alur kerja yang telah saya buat ketika saya dipekerjakan.)

Pikiran pertamaku adalah adil

ssh me@othermachine "sudo su - specialuser"

dan ini semacam bekerja, tapi itu membuat saya tidak cepat, ^Cmembunuh dan mengeluarkan saya, dan saya berasumsi berbagai hal lain mungkin salah juga.

Setelah membaca perintah Run Remote ssh dengan Full Login Shell saya mencoba beberapa hal yang lebih eksotis seperti

ssh me@othermachine 'bash -l -c "sudo su - specialuser"'

dan

ssh me@othermachine 'bash -l -c "sudo su - specialuser"; bash'

- tak satu pun dari yang saya harapkan untuk bekerja, dan mereka tidak, tapi saya pikir saya harus mencobanya untuk kelengkapan (dan untuk menghindari duplikat); mereka menghasilkan shell tanpa-prompt yang sama (yang kedua dengan shell tambahan tanpa-bonus tambahan untuk meafter exit-ing dari yang untuk specialuser). Dan saya mencoba

ssh me@othermachine "sudo su - specialuser -c bash -l"

tapi itu hanya membuat saya

sudo: no tty present and no askpass program specified

Ide yang lebih baik?

David Moles
sumber
Bagaimana dengan menambahkan perintah sudo ~/.profilesetelah penundaan singkat?
Alex
Idenya adalah bahwa dalam kasus aneh saya tidak ingin sudosaya harus memukul ^C? Jika saya tidak dapat menemukan sesuatu yang lebih baik saya bisa mencobanya.
David Moles
1
Anda bisa su medari specialuser. Atau di .profileatau .bashrc, jika Anda tidak mengikuti sudodengan exit, yang pertama exitakan membawa Anda kembali ke me, dengan yang kedua untuk mengakhiri sesi. Atau bahkan menggunakan file flag, jadi sudodidahului oleh [ -f ~/.keep.me ] && del ~/.keep.medan diikuti oleh [ \! -f ~/.keep.me ] && exit: Anda hanya perlu skrip atau alias untuk perintah mesebagai :>~/.keep.me; exit. Sekarang exitakan mengakhiri sesi Anda dan meakan kembali ke sesi login Anda.
AFH
1
Silakan mempertimbangkan untuk menulis dalam versi final Anda /bin/bashdan bukan yang sederhana bashuntuk alasan keamanan (untuk menghindari trojan ). Terutama jika ada sudosebelum ...
Hastur

Jawaban:

11

Baris ini seharusnya bekerja untuk Anda

ssh -t me@machine "sudo su - specialuser" 

Solusi ini memberi saya prompt atau tidak tergantung pada -tsaklar

ssh -t me@machine "/bin/bash -l"   # Give me a prompt

ssh  me@machine "/bin/bash -l"     # Give me NO prompt
ssh  me@machine                    # Give me NO prompt

Catatan dari man ssh

t
Angkatan alokasi pseudo-tty. Ini dapat digunakan untuk menjalankan program berbasis layar yang sewenang-wenang pada mesin jarak jauh, yang bisa sangat berguna, misalnya saat mengimplementasikan layanan menu. Opsi -t ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal .

Cepat
sumber
Ini berfungsi untuk saya ... dapatkah itu dilakukan melalui pengaturan ~ / .ssh / config khusus host juga?
Hei,
1
@di mana, ya Anda bisa melakukannya dengan RequestTTY force(yang sama -t) dan RemoteCommand sudo su - specialuser! Namun, perlu diketahui bahwa program lain yang menggunakan SSH (seperti scp, rsync, dll) tidak akan berfungsi dengan baik untuk host ini lagi.
Robert Riedl