Ketika saya memulai sesi SSH yang mengeksekusi perintah yang sudah berjalan lama, apa yang terjadi dengan penanganan Ctrl+ C(SIGINT)?
Saya dapat melihat bahwa sesi SSH ditutup, tetapi saya tidak yakin siapa yang mendapatkan SIGINT pertama: apakah itu ...
perintah jarak jauh yang berjalan lama? yaitu, (a) pengendali sinyal dalam perintah jarak jauh dipanggil dan menghentikan perintah jarak jauh, (b) shell yang menelurkannya mendeteksi bahwa perintah berhenti, dan berhenti juga (c) sshd jarak jauh mendeteksi shell berhenti, jadi itu menutup koneksi
atau
ssh lokal menerima sinyal, dan menutup koneksi.
Saya pikir (1) sedang terjadi, tetapi ingin memastikan.
Saya juga tidak yakin tentang apa yang terjadi dengan penanganan shell SIGINT dalam kasus ini. Misalnya, jika saya ...
ssh remote 'while true ; do sleep 1 ; date ; done'
dan Ctrl+ C, maka koneksi jarak jauh dijatuhkan. Apakah ada cara untuk menjalankan perintah remote di bawah shell yang akan tetap hidup setelah Ctrl+ C? Artinya, dalam hal ini, hentikan loop dan izinkan saya untuk terus bekerja pada shell jarak jauh?
ssh remote command
, sebagai lawan darissh remote
) akan dibunuh (di sisi lokal) oleh SIGINT yang dihasilkan dengan mengetikkan ctrl-C. Sisi jarak jauh mungkin (tergantung pada OS) tetap berjalan sampai mencoba membaca atau menulis ke soket yang tertutup. Jika Anda ingin semua penekanan tombol, termasuk ctrl-C, diteruskan ke remote, gunakanssh remote
.Jawaban:
ssh
dapat dipanggil dalam beberapa cara berbeda, masing-masing menghasilkan perlakuan yang sedikit berbeda dari sinyal yang diprakarsai terminal seperti Ctrl-C.ssh remotehost
akan menjalankan sesi interaktifremotehost
. Di sisi klien,ssh
akan mencoba untuk mengatur tty yang digunakan oleh stdin ke mode "raw", dansshd
pada remote host akan mengalokasikan pseudo-tty dan menjalankan shell Anda sebagai shell login (misalnya-bash
).Mengatur mode mentah berarti bahwa karakter yang biasanya mengirim sinyal (seperti Ctrl-Cdan Ctrl-\) malah dimasukkan ke dalam aliran input.
ssh
akan mengirim karakter seperti apa adanya ke host jarak jauh, di mana mereka kemungkinan akan mengirim SIGINT atau SIGQUIT dan, biasanya, membunuh perintah apa pun dan mengembalikan Anda ke shell pada host jarak jauh. Koneksi ssh akan tetap hidup, selama shell jarak jauh hidup.ssh -t remotehost command args ...
akan menjalankan sesi interaktifremotehost
, sama seperti di atas, kecuali di sisi jarak jauh,your_shell -c "command args ..."
akan dijalankan. Seperti di atas, jika Anda mengetik Ctrl-C, itu akan dikirim ke host jarak jauh, di mana perintah kemungkinan akan menerima SIGINT dan segera keluar, dan kemudian shell jauh akan keluar. Remotesshd
kemudian menutup koneksi, danssh
melaporkanConnection to remotehost closed.
ssh remotehost command args ...
akan menjalankan sesi non-interaktifremotehost
. Di sisi klien, tidakssh
akan mengatur tty ke mode mentah (well, kecuali untuk membaca kata sandi atau frasa sandi). Jika Anda mengetik , akan dikirim SIGINT dan akan segera dihentikan, bahkan tanpa mengeluarkan pesan.Ctrl-Cssh
Connection to remotehost closed
The
your_shell -c "command args ..."
proses akan cenderung tetap berjalan pada host remote . Entah mereka akan keluar sendiri, atau satu proses akan mencoba untuk menulis data ke soket ssh yang sekarang ditutup, yang akan menyebabkan sinyal SIGPIPE (biasanya) fatal dikirim ke sana.sumber