.bashrc
문자를 읽고 일부 키워드를 수정하는 awk 스크립트가 있습니다 . 다른 기본 명령을 파이프하면 잘 작동 tail -f
하지만 ssh를 파이프하면 문제가 발생합니다. Enter를 누를 때까지 터미널에 입력한 내용을 볼 수 없다는 점을 제외하면 모든 것이 예상대로 잘 작동합니다.
~# ssh admin@localhost -p 5200 | my-script
admin@localhost's password:
admin connected from 127.0.0.1 using ssh on home
admin@ssh-server> exit ***<- I don't see this line (including the prompt) at all on terminal until I type my command (exit) and press Enter***
Connection to localhost closed.
나생각하다왜 이런 일이 발생하는지 이해하지만 해결 방법을 모르겠습니다. EOL이 반환될 때까지 ssh에 대한 대화형 명령이 파이프를 통해 전송되지 않는다고 생각합니다. 나는 unbuffer/stdbuf에서 tee/script까지 검색하고 다양한 리디렉션 명령을 사용하여 찾을 수 있는 모든 것을 시도했지만 운이 없었습니다.
노트: 사실, EOL 이후에 문자열을 내 스크립트에 전달할 수 있습니다. 단지 내가 입력하고 있는 내용을 볼 수 있으면 됩니다. 즉, 터미널 stdin이 평소처럼 에코되어야 합니다.
답변1
나는 다음을 할 수 있습니다:
$ ssh [email protected] | tee output
Last login: Tue Aug 15 03:06:11 2017 from 127.1.2.3
$ ls /
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
$ logout
Shared connection to example.com closed.
$ cat output
Last login: Tue Aug 15 03:06:11 2017 from 127.1.2.3
$ ls /
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
$ logout
ssh
정상적으로 원격 호스트를 편집하면 프롬프트, 내가 입력한 내용 등이 모두 표시됩니다.
답변2
대화형 셸에서 작동하는 데 터미널이 필요하지 않은 경우 옵션을 추가하여 -T
SSH 클라이언트에서 PTY를 비활성화하는 것을 고려하세요.SSH(1)주문하다. 이 경우 에코는 로컬 터미널에서 수행되므로 입력을 볼 수 있습니다.
OpenSSH를 참고하세요.SSH(1)PTY가 활성화되면 stderr이 stdout으로 리디렉션되므로 PTY가 비활성화되면 스크립트에서 얻을 수 있는 데이터가 줄어들 수 있습니다. 당신은 또한 볼 수 있습니다https://stackoverflow.com/questions/16838624/why-does-openssh-requesttty-cause-stderr-redirected-to-stdout.