장기 실행 명령을 실행하는 SSH 세션을 시작할 때 Ctrl+ (SIGINT) 처리 C는 어떻게 되나요 ?
SSH 세션이 닫힌 것을 볼 수 있지만 누가 SIGINT를 먼저 받았는지 확실하지 않습니다. 그랬습니까?
원격 장기 실행 명령? 즉, (a) 원격 명령의 신호 처리기가 호출되고 원격 명령이 중지되고, (b) 이를 생성한 쉘이 명령이 중지되었음을 감지하고 또한 중지합니다. (c) 원격 sshd가 쉘이 중지되었음을 감지합니다. 중지되었으므로 연결이 닫힙니다.
또는
로컬 SSH는 신호를 수신하고 연결을 닫습니다.
나는 (1)이 일어나고 있다고 생각하지만 확인하고 싶습니다.
또한 이 경우 쉘의 SIGINT 처리에 어떤 일이 발생하는지 잘 모르겠습니다. 예를 들어, 내가...
ssh remote 'while true ; do sleep 1 ; date ; done'
및 Ctrl+를 C누르면 원격 연결이 끊어집니다. Ctrl+ 이후에 활성 상태로 유지되는 셸에서 원격 명령을 실행하는 방법이 있습니까 C? 즉, 이 경우 루프를 중지하고 원격 셸에서 작업을 계속하도록 허용하시겠습니까?
답변1
ssh
여러 가지 방법으로 호출할 수 있으며, 각각은 터미널에서 시작된 신호에 응답합니다(예: Ctrl-C.
ssh remotehost
대화형 세션이 에서 실행됩니다remotehost
. 클라이언트 측에서는 stdin에서 사용하는 tty를 "raw" 모드로 설정하고 원격 호스트에 pseudo-tty를 할당하고 쉘을 로그인 쉘(예: )로 실행하려고ssh
합니다 .sshd
-bash
원시 모드를 설정하면 일반적으로 신호를 보내는 문자(예: Ctrl-C및 Ctrl-\)가 입력 스트림에 삽입됩니다.
ssh
이러한 문자는 있는 그대로 원격 호스트에 전송되며 SIGINT 또는 SIGQUIT를 보낼 수 있으며 일반적으로 모든 명령을 종료하고 원격 호스트의 쉘로 돌아갑니다. 원격 셸이 활성화되어 있는 동안 SSH 연결은 활성 상태로 유지됩니다.ssh -t remotehost command args ...
대화형 세션은 위와 마찬가지로 에서 실행됩니다remotehost
. 단, 원격 측에서는 에서your_shell -c "command args ..."
실행됩니다. 위에서 언급했듯이 를 입력하면 Ctrl-C원격 호스트로 전송되고 명령은 SIGINT를 수신하고 즉시 종료될 수 있으며 이후 원격 쉘이 종료됩니다. 그러면 리모컨이sshd
연결을 닫고ssh
보고합니다 .Connection to remotehost closed.
ssh remotehost command args ...
비대화형 세션이 에서 실행됩니다remotehost
.ssh
클라이언트 측에서는아니요tty를 원시 모드로 설정합니다(암호나 암호 문구 읽기는 제외). 를 입력하시면 Ctrl-CSIGINTssh
를 받고Connection to remotehost closed
메시지도 보내지 않고 바로 종료됩니다.이러한
your_shell -c "command args ..."
프로세스는원격 호스트에서 아직 실행 중일 수 있습니다.. 그들은 스스로 종료하거나 프로세스가 현재 닫힌 ssh 소켓에 데이터를 쓰려고 시도하며 이로 인해 (보통) 치명적인 SIGPIPE 신호가 전송됩니다.