ssh를 쉘 스크립트에 파이프하지만 stdin 에코를 볼 수 없습니다

ssh를 쉘 스크립트에 파이프하지만 stdin 에코를 볼 수 없습니다

.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

대화형 셸에서 작동하는 데 터미널이 필요하지 않은 경우 옵션을 추가하여 -TSSH 클라이언트에서 PTY를 비활성화하는 것을 고려하세요.SSH(1)주문하다. 이 경우 에코는 로컬 터미널에서 수행되므로 입력을 볼 수 있습니다.

OpenSSH를 참고하세요.SSH(1)PTY가 활성화되면 stderr이 stdout으로 리디렉션되므로 PTY가 비활성화되면 스크립트에서 얻을 수 있는 데이터가 줄어들 수 있습니다. 당신은 또한 볼 수 있습니다https://stackoverflow.com/questions/16838624/why-does-openssh-requesttty-cause-stderr-redirected-to-stdout.

관련 정보