2017-12-03 29 views
1

을 폐쇄 신호 방식. read() '는 클라이언트 쪽에서 너무 낮은 수준을 유지하지 않고 영원히 멈추지 않습니다. 지금까지 나는에 의해 완성 된 명령 (표준 출력 간단한 텍스트 출력) 실행 의사 소통을 할 수 있었다 :Paramiko 서버는 : 표준 출력 클라이언트는</strong>, 나는`표준 출력을 만드는 <code>stdout</code> 스트림을 닫는 방법 문제를 우연히 발견 한 테스트를위한 클라이언트를 수정할 필요없이 <code>paramiko</code><strong>에 테스트 서버를 구현하기 위해 노력

class FakeCluster(paramiko.server.ServerInterface): 
    def check_channel_exec_request(self,channel,command): 
     writemessage = channel.makefile("w") 
     writemessage.write("SOME COMMAND SUBMITTED") 
     writemessage.channel.send_exit_status(0) 
     return True 

을하지만 난

_,stdout,_ = ssh.exec_command("<FILEPATH>") 
    stdout.channel.recv_exit_status() 
    stdout.channel.close() 
    print(stdout.read()) 

에 중간 두 줄을 피하기 위해 방법을 발견하지 않았습니다있는 이미 channel.exec_command (here)으로 전화하지 않아도 좋은 해결 방법입니다. stdout 스트림을 닫지 않으면 출력이 인쇄되지 않고 서버의 기본 전송도 영원히 활성 상태로 유지됩니다.

정말 효과가 없습니다 stdout.channel.close()으로 채널을 닫고 대안 I에 사용되는 paramiko.channel.ChannelFile 개체/O가 "더 속성 'fileno를'이 없다"스트림 때문에 os.close(writemessage.fileno())은 (차이가 here 설명) 작동하지 않습니다 사용.

솔루션은 항상 클라이언트 측을 수정 할 here를 제안 .. 클라이언트에 대한 SSHException를 throw 서버 측에서 직접 채널을 폐쇄,

또한 (자세한 설명은. here을 발견)하지만 내 클라이언트 스크립트를 사용하여 알고 실제 서버에서는 이러한 추가 라인이 없어도 가능할 것입니다!

답변

0

check_channel_exec_request에서 종료 상태가 전송 된 후 서버 측의 채널을 종료합니다. 프로토콜 사양에 따라 실행 된 명령의 수명이 만료되고 이후에 닫히는 채널입니다.

이로 인해 클라이언트 측에서 channel.eof()True이되어 명령이 끝났음을 나타내며 채널에서 읽기가 더 이상 중단되지 않음을 나타냅니다.

def check_channel_exec_request(self,channel,command): 
    writemessage = channel.makefile("w") 
    writemessage.write("SOME COMMAND SUBMITTED") 
    writemessage.channel.send_exit_status(0) 
    channel.close() 
    return True 

참조를 위해 몇 년 동안 주변되었습니다 paramiko에 따라이 embedded server for integration testing 참조 - 그것은 다른 사람의 사이에서 간부 요청을 구현합니다. 경험으로 말하면, 임베디드 OpenSSH 기반 서버 인 example of which can also be found on the same repository을 사용하는 것이 좋습니다. Paramiko 코드는 특히 버그가 없습니다.