SSH oturumunda Ctrl-C işleme


20

Uzun süredir çalışan bir komut yürüten bir SSH oturumu başlattığımda, Ctrl+ C(SIGINT) işleme ile ne olur ?

SSH oturumunun kapalı olduğunu görebiliyorum, ancak SIGINT'i ilk kimin aldığından emin değilim:

  1. uzak çalışan komut? yani, (a) uzak komuttaki sinyal işleyici çağrılır ve uzak komutu durdurur, (b) ortaya çıkan kabuk komutun durduğunu algılar ve durur (c) uzak sshd kabuğun durduğunu algılar, böylece bağlantıyı kapatır

    veya

  2. yerel ssh sinyali alır ve bağlantıyı kapatır.

Bence (1) oluyor ama emin olmak istiyorum.

Ayrıca, bu durumda SIGINT'lerin kabuk işlemesinde ne olacağı konusunda emin değilim. Örneğin, eğer ben ...

ssh remote 'while true ; do sleep 1 ; date ; done'

ve Ctrl+ C, uzak bağlantı kesilir. Uzaktan komutu Ctrl+ işaretinden sonra hayatta kalacak bir kabuk altında çalıştırmanın bir yolu var mı C? Yani, bu durumda, döngüyü durdurun ve uzak kabuk üzerinde çalışmaya devam etmeme izin verin?


3
Etkileşimli olmayan bir ssh ( ssh remote commandaksine ssh remote) ctrl-C yazılarak oluşturulan SIGINT tarafından (yerel tarafta) öldürülecektir. Uzak taraf muhtemelen (işletim sistemine bağlı olarak) kapalı sokete okumaya veya yazmaya çalışana kadar çalışmaya devam eder. Ctrl-C dahil tüm tuş vuruşlarınızın uzaktan kumandaya iletilmesini istiyorsanız kullanın ssh remote.
Mark Plotnick

@ MarkPlotnick: Tamam İşaretle - Cevabınızı aşağıda cevap olarak eklerseniz, kabul edeceğim ... Kendi testlerimde, uzaktan kumandanın herhangi bir sinyal almadığını doğruladım.
ttsiodras

Yanıtlar:


23

sshbirkaç farklı yolla çağrılabilir, her biri terminal tarafından başlatılan sinyallerin biraz farklı muamelesine yol açar Ctrl-C.

  • ssh remotehosttarihinde etkileşimli bir oturum çalıştırılacaktır remotehost. İstemci tarafında, sshstdin tarafından kullanılan tty'yi "raw" moduna ayarlamaya çalışacak sshdve uzak ana bilgisayarda bir pseudo-tty tahsis edecek ve kabuğunuzu bir giriş kabuğu (örn. -bash) Olarak çalıştıracaktır .

    Ham modunun ayarlanması, normalde sinyal gönderecek olan karakterlerin ( Ctrl-Cve gibi Ctrl-\) giriş akışına eklendikleri anlamına gelir . sshbu karakterleri olduğu gibi uzak ana bilgisayara gönderir, burada SIGINT veya SIGQUIT gönderir ve genellikle herhangi bir komutu öldürür ve sizi uzak ana bilgisayardaki bir kabuğa geri gönderir. Uzak kabuk canlı olduğu sürece ssh bağlantısı canlı kalacaktır.

  • ssh -t remotehost command args ...etkileşimli bir oturum çalıştırır remotehost, tıpkı yukarıdaki gibi uzak taraf dışında your_shell -c "command args ..."çalıştırılır. Yukarıdaki gibi, yazarsanız Ctrl-C, komutun büyük olasılıkla SIGINT'i alıp hemen çıkacağı uzak ana bilgisayara gönderilir ve ardından uzak kabuk çıkar. Uzaktan kumanda sshddaha sonra bağlantıyı kapatır ve sshrapor verirConnection to remotehost closed.

  • ssh remotehost command args ...tarihinde etkileşimli olmayan bir oturum çalıştırılacaktır remotehost. İstemci tarafında, ssholacak değil ham modunu (kuyu, ya da anahtar parolası okumak hariç) için tty ayarlayın. Eğer yazarsanız Ctrl-C, sshSIGINT gönderilir ve bir Connection to remotehost closedmesaj bile vermeden derhal sonlandırılır .

    your_shell -c "command args ..."Süreçler olacaktır olasılıkla uzak ana çalışan kalır . Ya kendi başlarına çıkacaklar ya da bir işlem şimdi kapalı olan ssh soketine veri yazmaya çalışacak ve bu da (tipik olarak) ölümcül bir SIGPIPE sinyalinin ona gönderilmesine neden olacaktır.


1
Teknik olarak, uzaktan komut doğrudan sokete yazmaz. Stdout bir boru. Ve diğer uçtaki sshd verileri okur, şifreler ve soket üzerinden gönderir. Sonuç yine de aynıdır. Komut bir sigpipe alacaktır, çünkü istemci bağlantısı kesildiğinde o boru gitmiştir.
Stéphane Chazelas

@ StéphaneChazelas Teşekkürler, düzeltmek için cevabı düzenleyeceğim.
Mark Plotnick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.