답변:
에서
ssh host tail -f file
ssh
클라이언트가 연결 sshd
에서 서버 host
의 TCP 연결을 통해. stdout이 파이프로 리디렉션 된 상태로 sshd
실행됩니다 tail -f
. sshd
파이프의 다른 쪽 끝에서 오는 내용을 읽고 sshd 프로토콜로 캡슐화하여 ssh
클라이언트 로 보냅니다 . (와 함께 rshd
, tail
stdout은 소켓 이었지만, sshd
암호화를 추가하고 단일 TCP 연결에서 여러 스트림 (예 : 포트 / 에이전트 / X11 / 터널 리디렉션, stderr)을 멀티플렉싱 할 수 있으므로 파이프를 사용해야합니다).
CTRL-C를 누르면 SIGINT가 ssh
클라이언트 로 전송됩니다 . 그로 인해 ssh
사망하게됩니다. 죽으면 TCP 연결이 닫힙니다. 그러므로 on host
도 sshd
죽습니다. tail
죽지 않았지만 stdout은 이제 반대쪽 끝에 독자가없는 파이프입니다. 따라서 다음에 stdout에 무언가를 쓸 때 SIGPIPE를 받고 죽습니다.
에서:
ssh -t host 'tail -f file'
대신 파이프와 인의 간의 통신한다는 것을 제외하고는 동일한 것이다 sshd
및 tail
의사 단말로한다. tail
의 표준 출력하는 슬레이브 의사 단말 (등 /dev/pts/12
)과 어떤 tail
가 작성 read
하여 마스터 측 (아마도 TTY 광고 분야 의해 변형)에 sshd
상기 캡슐화 보냈 ssh
클라이언트.
클라이언트 측에서로 -t
, ssh
풋 터미널이있는 raw
모드입니다. 특히, 이는 터미널 표준 모드 및 터미널 신호 처리를 비활성화합니다.
누를 때, Ctrl+C클라이언트의 터미널 제어 규칙이에 SIGINT를 보내는 대신 ssh
작업, 그것은 바로 전송 ^C
받는 연결을 통해 캐릭터 sshd
와 sshd
그 쓰기 ^C
원격 터미널의 마스터 측에 있습니다. 원격 단말기의 제어 규칙은을 전송 SIGINT
로 tail
. tail
그런 다음 sshd
연결이 끊어지고 연결을 종료하고 닫은 후 ssh
종료됩니다 (포트 포워딩 또는 기타로 바쁘지 않은 경우).
또한,과 -t
의 경우 ssh
클라이언트 다이가 (예를 들어 사용자가 입력 한 경우 ~.
), 연결이 닫히고 sshd
다이. 결과적으로 SIGHUP이 (으)로 전송됩니다 tail
.
자, 사용하면 -t
부작용이 있다는 것을 명심하십시오 . 예를 들어, 기본 터미널 설정 을 사용하면 원격 시스템에 따라 \n
문자가 변환 \r\n
되고 더 많은 일이 발생할 수 있으므로 stty -opost
해당 출력이 의도되지 않은 경우 원격 호스트에서 (출력 사후 처리 사용 안함) 을 발행 할 수 있습니다 터미널 :
$ ssh localhost 'echo x' | hd
00000000 78 0a |x.|
00000002
$ ssh -t localhost 'echo x' | hd
00000000 78 0d 0a |x..|
00000003
$ ssh -t localhost 'stty -opost; echo x' | hd
00000000 78 0a |x.|
00000002
-t
/ 를 사용하는 또 다른 단점은 -tt
stdout과 stderr이 클라이언트에서 구별되지 않는다는 것입니다. 원격 명령의 stdout 및 stderr은 모두 ssh
클라이언트의 stdout에 기록됩니다 .
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1
-t
, ssh
클라이언트가 사망하는 경우 (예 :을 입력 한 경우 ~.
)" ~.
다시 무엇입니까 ?
~.
는 클라이언트 연결을 끊기 위해 입력 한 이스케이프 시퀀스입니다. 자세한 내용 man ssh
을 참조하십시오.
원격 측에서 터미널 할당이 필요합니다.
ssh -t user@remote_host tail -f /some/file
또는
ssh -tt user@remote_host tail -f /some/file
-t
또는 감사 -tt
합니다. 그러나 나는 여전히 이것의 실제 이유를 이해할 수 없습니다. 즉, 셸을 원격으로 호출하고 연결을 닫으면 셸이 종료됩니다. 그러나 tail -f
그렇지 않습니다. 물론 -t
에서 옵션에 대해 이미 읽었 man ssh
지만별로 도움이되지 않았습니다. 일부 제네릭을 이해하지 못하는 것 같습니다. 문서에 대해 읽거나 직접 설명 할 문서를 제안하면 기쁠 것입니다. 감사!
sshd
보냅니다 SIGHUP
. 그러나 터미널이없는 곳에서는 터미널 연결 끊기가 없습니다 ...
SIGHUP
다른 신호를 읽을 것입니다.
tail -f
, 그때 나는 연 htop
및 전송 SIGHUP
(눌러서에 F9
-> 1
-> Enter
), 그리고 tail -f
종료! 따라서 이유는 약간 달라야합니다.
tail
반응하지 것이다 SIGHUP
. 문제는 의사 터미널없이 SIGHUP
** 전송되지 않는다 ' tail
입니다. 두 경우 모두 에 연결 strace
하면 알 수 있습니다 tail
.