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 ...
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
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ą?
ssh remote command
w przeciwieństwie dossh 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żyjssh remote
.Odpowiedzi:
ssh
moż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 remotehost
uruchomi interaktywną sesjęremotehost
. Po stronie klientassh
spróbuje ustawić tty używane przez stdin w trybie „surowym”, asshd
na 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.
ssh
wyś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 pilotsshd
zamyka połączenie issh
zgłasza raportyConnection to remotehost closed.
ssh remotehost command args ...
uruchomi sesję nieinteraktywnąremotehost
. Po stronie klienta,ssh
będzie nie ustawić TTY trybie surowym (dobrze, z wyjątkiem zapoznania się hasłem lub hasłem). Jeśli wpiszesz Ctrl-C,ssh
otrzymasz SIGINT i zostanie natychmiast zakończone, nawet nie wysyłającConnection to remotehost closed
wiadomoś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.źródło