2017-02-22 19 views
3

perl Net :: SSH2 v0.48을 사용하고 있으며 stdin에서 입력을 읽는 원격 스크립트를 실행하려고합니다. 이 연결의 채널은 특정 요구 사항에 vt100 pty를 사용합니다. stdin에 데이터를 쓰고 난 후에도 $channel->send_eof();라고합니다. 그러나 원격 스크립트는 EOF 문자를 전혀받지 못하는 것 같습니다. 원격 스크립트는 파이썬에 있고 sys.stdin.read()과 같은 stdin에서 읽기 때문에 EOF를 얻을 때까지 중단됩니다. 이 문제는 단순히 pty를 비활성화하거나 EOF 문자 인 입력 페이로드가있는 chr(4)을 추가 할 때 해결됩니다.pty 모드 및 EOF에서 Perl Net :: SSH2

질문 : 어떤 생각이 왜 send_eof()

  1. 작동하지 않습니다?
  2. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
  3. pty를 사용하는 경우 send_eof()이 필요하지 않다고 가정 할 수 있습니까?

P. 프로덕션 코드가 너무 복잡하여 문제를 설명 할 수 없기 때문에 코드 스 니펫을 포함하지 않으며 최소 코드의 작업 버전을 준비하는 데 약간의 시간이 걸립니다. 하지만 곧 코드 샘플로 내 질문을 업데이트하려고 노력할 것입니다.

+0

버전 0.48은 상당히 오래되고 버그가 있습니다. 최신 버전을 사용해야합니다. – salva

답변

2

pty가 활성화 된 경우 send_eof()가 필요하지 않다고 가정 할 수 있습니까? docs 가입일

:

send_eof 원격 측에 EOF를 보낸다.

EOF를 보낸 후에는STDIN 채널에 더 이상 데이터가 전송되지 않을 수 있습니다.

채널에 대해 PTY가 요청 된 경우 EOF가 원격 서버에 의해 무시 될 수 있습니다.

+0

'EOF는 원격 서버에 의해 무시 될 수 있습니다 .'라고 말하면, 입력 된 데이터의 일부로 추가하더라도 EOF가 무시 될 수 있다는 것을 의미하지 않습니까? 분명히 그것은 일어나지 않지만 전체 그림을 얻으려면 더 많은 정보가있는 것처럼 보입니다. – Samiron

+0

Tty 장치는 연결의 한 쪽만 닫을 수 없습니다. 그렇기 때문에 채널 수준의 EOF 요청은 무시됩니다. – salva