Obsługa Ctrl-C w sesji SSH

20

Kiedy rozpoczynam sesję SSH, która wykonuje długo działające polecenie, co dzieje się z obsługą Ctrl+ C(SIGINT)?

Widzę, że sesja SSH jest zamknięta, ale nie jestem pewien, kto pierwszy otrzyma SIGINT: czy to ...

  1. zdalne długo działające polecenie? to znaczy (a) procedura obsługi sygnału w zdalnym poleceniu jest wywoływana i zatrzymuje polecenie zdalne, (b) powłoka, która go stworzyła, wykrywa zatrzymanie polecenia, a także się zatrzymuje (c) zdalny sshd wykrywa zatrzymanie powłoki, więc zamyka połączenie

    lub

  2. lokalny ssh odbiera sygnał i zamyka połączenie.

Myślę, że (1) się dzieje, ale chcę się upewnić.

W tym przypadku nie jestem również pewien, co się stanie z obsługą powłoki SIGINT. Na przykład, jeśli ...

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

i Ctrl+ C, wtedy połączenie zdalne zostanie zerwane. Czy istnieje sposób uruchomienia polecenia zdalnego pod powłoką, która pozostanie przy życiu po Ctrl+ C? Oznacza to, że w tym przypadku zatrzymaj pętlę i pozwól mi kontynuować pracę nad zdalną powłoką?

ttsiodras
źródło
3
Nieinteraktywny ssh ( ssh remote commandw przeciwieństwie do ssh remote) zostanie zabity (po stronie lokalnej) przez SIGINT wygenerowany przez wpisanie ctrl-C. Strona zdalna prawdopodobnie (w zależności od systemu operacyjnego) pozostanie uruchomiona, dopóki nie spróbuje odczytać lub zapisać w zamkniętym gnieździe. Jeśli chcesz, aby wszystkie twoje naciśnięcia klawiszy, w tym ctrl-C, były przekazywane do pilota, użyj ssh remote.
Mark Plotnick
@MarkPlotnick: OK Zaznacz - jeśli dodasz swoją odpowiedź poniżej jako odpowiedź, zaakceptuję ją ... W moich testach zweryfikowałem, że pilot nie odbiera żadnego sygnału.
ttsiodras
powiązane: unix.stackexchange.com/questions/40023/…
bernard paulus

Odpowiedzi:

23

sshmożna wywoływać na kilka różnych sposobów, z których każdy skutkuje nieco innym traktowaniem sygnałów inicjowanych przez terminal, takich jak Ctrl-C.

  • ssh remotehosturuchomi interaktywną sesję remotehost. Po stronie klienta sshspróbuje ustawić tty używane przez stdin w trybie „surowym”, a sshdna zdalnym hoście przydzieli pseudo-tty i uruchomi powłokę jako powłokę logowania (np -bash.).

    Ustawienie trybu raw oznacza, że ​​znaki, które normalnie wysyłałyby sygnały (takie jak Ctrl-Ci Ctrl-\), są po prostu wstawiane do strumienia wejściowego. sshwyśle ​​takie znaki w stanie „jak jest” do zdalnego hosta, gdzie prawdopodobnie wyśle ​​SIGINT lub SIGQUIT i zazwyczaj zabije dowolne polecenie i zwróci cię do powłoki na zdalnym hoście. Połączenie ssh pozostanie aktywne, dopóki zdalna powłoka będzie żyła.

  • ssh -t remotehost command args ...uruchomi interaktywną sesję remotehost, podobnie jak powyżej, oprócz zdalnej, your_shell -c "command args ..."zostanie uruchomiona. Jak wyżej, jeśli wpiszesz Ctrl-C, zostanie wysłany do zdalnego hosta, gdzie polecenie prawdopodobnie otrzyma SIGINT i natychmiast zakończy działanie, a następnie zdalna powłoka zostanie zamknięta. Następnie pilot sshdzamyka połączenie i sshzgłasza raportyConnection to remotehost closed.

  • ssh remotehost command args ...uruchomi sesję nieinteraktywną remotehost. Po stronie klienta, sshbędzie nie ustawić TTY trybie surowym (dobrze, z wyjątkiem zapoznania się hasłem lub hasłem). Jeśli wpiszesz Ctrl-C, sshotrzymasz SIGINT i zostanie natychmiast zakończone, nawet nie wysyłając Connection to remotehost closedwiadomości.

    Te your_shell -c "command args ..."procesy będą prawdopodobnie pozostanie uruchomiony na zdalnym komputerze . Albo same wyjdą, albo jeden proces spróbuje zapisać dane do obecnie zamkniętego gniazda ssh, co spowoduje wysłanie do niego (zwykle) śmiertelnego sygnału SIGPIPE.

Mark Plotnick
źródło
1
Technicznie zdalne polecenie nie pisze bezpośrednio do gniazda. Jego stdout to fajka. A sshd na drugim końcu odczytuje dane, szyfruje je i wysyła przez gniazdo. Wynik końcowy jest taki sam. Komenda otrzyma sigpipe, ponieważ ta rura zniknęła, gdy klient się rozłączy.
Stéphane Chazelas
@ StéphaneChazelas Dzięki, zmienię odpowiedź, aby ją poprawić.
Mark Plotnick