SSH 세션에서 Ctrl-C 처리


20

장기 실행 명령을 실행하는 SSH 세션을 시작할 때 Ctrl+ C(SIGINT) 처리는 어떻게됩니까?

SSH 세션이 닫혀 있음을 알 수 있지만 누가 먼저 SIGINT를 얻는 지 잘 모르겠습니다.

  1. 원격 장기 실행 명령? 즉, (a) 원격 명령의 신호 처리기가 호출되어 원격 명령을 중지합니다. (b) 명령을 생성 한 셸은 명령이 중지되었음을 감지하고 중지합니다. (c) 원격 sshd는 셸이 중지되었음을 감지합니다. 연결을 닫습니다

    또는

  2. 로컬 ssh가 신호를 수신하고 연결을 닫습니다.

나는 (1)이 일어나고 있다고 생각하지만 확인하고 싶다.

또한이 경우 SIGINT의 셸 처리로 어떤 일이 발생하는지 확실하지 않습니다. 예를 들어, 만약 내가 ...

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

Ctrl+는 C, 다음 원격 접속이 삭제된다. Ctrl+ 후에도 계속 유지되는 쉘에서 원격 명령을 실행하는 방법이 C있습니까? 즉,이 경우 루프를 중지하고 원격 쉘에서 계속 작업 할 수 있습니까?


3
ctrl-C를 입력하여 생성 된 SIGINT에 의해 비 대화식 ssh ( ssh remote command, 반대 ssh remote)가 (로컬 측에서) 종료됩니다. 원격 쪽은 아마도 (OS에 따라) 닫힌 소켓을 읽거나 쓰려고 시도 할 때까지 계속 실행됩니다. ctrl-C를 포함한 모든 키 입력을 리모컨으로 전달하려면을 사용하십시오 ssh remote.
마크 Plotnick

@MarkPlotnick : OK Mark-아래 답변을 답변으로 추가하면 수락하겠습니다 ... 자체 테스트에서 리모컨에 신호가 수신되지 않는지 확인했습니다.
ttsiodras

답변:


23

ssh는 몇 가지 다른 방식으로 호출 될 수 있으며, 각각은 터미널에서 시작하는 신호의 처리 방식이 약간 다릅니다 Ctrl-C.

  • ssh remotehost에 대화식 세션을 실행합니다 remotehost. 클라이언트 측에서는 sshstdin이 사용하는 tty를 "원시"모드로 설정하려고 시도 sshd하고 원격 호스트에서는 의사 tty를 할당하고 쉘을 로그인 쉘 (예 :)로 실행합니다 -bash.

    원시 모드를 설정하면 일반적으로 신호를 보내는 문자 (예 : Ctrl-CCtrl-\)가 입력 스트림에 삽입됩니다. sshSIGINT 또는 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수 없습니다 원시 모드 (물론, 암호 또는 암호에 읽을 제외)로 청각 장애를 설정합니다. 사용자가 입력하는 경우 Ctrl-C, sshSIGINT를 보내 얻을 것이다 즉시도 발행하지 않고, 종료됩니다 Connection to remotehost closed메시지.

    your_shell -c "command args ..."프로세스는 것입니다 가능성이 원격 호스트에서 실행 남아있다 . 그들은 스스로 종료하거나 하나의 프로세스가 현재 닫힌 ssh 소켓에 데이터를 쓰려고 시도하여 (일반적으로) 치명적인 SIGPIPE 신호가 전송됩니다.


1
기술적으로 원격 명령은 소켓에 직접 쓰지 않습니다. 표준 출력은 파이프입니다. 그리고 다른 쪽 끝에있는 sshd는 데이터를 읽고 암호화하여 소켓을 통해 보냅니다. 최종 결과는 동일합니다. 클라이언트 연결이 끊어지면 파이프가 없어 지므로 명령은 sigpipe를 가져옵니다.
Stéphane Chazelas

@ StéphaneChazelas 감사합니다. 답변을 수정하여 수정하겠습니다.
Mark Plotnick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.