Saya menjalankan perintah di bawah ini, dan memonitor file output di sistem lain:
ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Jika saya mematikan perintah ssh menggunakan ^C
atau dengan hanya membunuh terminal saya login, saya akan mengharapkan perintah jarak jauh untuk mengakhiri juga. Ini tidak terjadi, meskipun: /tmp/count
dapatkan semua angka 1-5 terlepas, dan ps -ejH
menunjukkan cangkang dan sleep
anaknya terus berjalan.
Apakah ini perilaku yang diharapkan, dan apakah itu didokumentasikan di mana saja? Bisakah saya menonaktifkannya? Dari membaca sekitar, saya diharapkan untuk secara eksplisit mengaktifkan perilaku semacam ini dengan nohup, bukan untuk itu menjadi default.
Saya telah melihat-lihat halaman manual untuk ssh dan sshd, tetapi tidak menemukan sesuatu yang jelas, dan Google menunjuk saya pada instruksi untuk mengaktifkan perilaku ini, bukan untuk mematikannya.
Saya menjalankan Red Hat Enterprise Linux 6.2, dengan login root dan bash shell di kedua sistem.
-tt
sebagai ganti-t
jika ssh itu sendiri tidak memiliki alokasi tty. SSH tidak akan mendapatkan tty yang dialokasikan jika ssh mendapatkan latar belakang segera setelah pemanggilan melalui opsi seperti-f
atau-n
.Coba alokasikan psuedo-tty dengan
ssh
perintah Anda .ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Ketika Anda memutuskan sesi ssh, prosesnya harus berakhir.
Karena ini adalah pseudo-tty, inisialisasi shell Anda mungkin tidak akan mencari file konfigurasi, meninggalkan perintah Anda dengan lingkungan yang sangat kosong. Anda mungkin perlu mengatur
.ssh/environment
file yang mendefinisikan variabel lingkungan seperti PATH. Dariman 1 ssh
sumber
Sebagai alternatif untuk menggunakan
-t
opsi untukssh
membuat perintah jarak jauh berakhir ketikassh
klien keluar atau (terbunuh), pipa bernama dapat digunakan untuk mengubah "EOF ke SIGHUP" ketika stdinsshd
sedang ditutup (lihat Bug 396 - sshd yatim piatu memproses bila tidak ada pty yang dialokasikan ).sumber
Ini adalah cara terbaik yang saya temukan untuk melakukan ini. Anda menginginkan sesuatu di sisi server yang mencoba membaca stdin dan kemudian membunuh grup proses ketika itu gagal, tetapi Anda juga ingin stdin di sisi klien yang memblokir sampai proses sisi server dilakukan dan tidak akan meninggalkan proses yang tersisa seperti <( sleep infinity) mungkin.
Tampaknya tidak mengarahkan stdout di mana pun tetapi berfungsi sebagai input pemblokiran dan menghindari penekanan tombol.
Bug openssh yang relevan: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14
sumber
Jika Anda ingin menonaktifkan itu (kelihatannya perilaku default), Anda perlu mengaktifkan ssh-keep-hidup di sisi klien atau server.
Jika Anda melihat opsi ssh-keep-hidup-di halaman manual, Anda dapat melihat bahwa mereka dinonaktifkan secara default.
sumber
Jawaban saya didasarkan pada teru. Saya memerlukan skrip pembantu
~/helper
di server server.ip:Jika itu disebut misalnya dengan
dan dijalankan
echo hello from server
di server.ip, dan kemudian klien ssh akan berakhir.Jika itu disebut misalnya dengan
kill -9 $CHID
akan menghentikan skrip di server juga. Bagi saya,kill -INT $CHID
tidak berhasil, tetapi saya tidak tahu mengapa.Dalam jawaban teru, perintah ssh akan menunggu selamanya ketika perintah jarak jauh selesai, karena
cat
tidak pernah selesai.Semua jawaban dengan ssh -t tidak bekerja untuk saya
kill
, tetapi hanya dengan Ctrl-C.Sunting: Saya menemukan ini bekerja dari Ubuntu 14,01 baru ke kotak linux ilmiah tua - tetapi tidak sebaliknya. Jadi, saya pikir tidak ada solusi umum. Aneh.
sumber