복붙노트

[PYTHON] paramiko ssh exec_command에서 지속적으로 출력을 얻습니다.

PYTHON

paramiko ssh exec_command에서 지속적으로 출력을 얻습니다.

paramiko를 사용하는 원격 컴퓨터에서 ssh를 통해 장시간 실행되는 python 스크립트를 실행하고 있습니다. 매력처럼 작동하며 지금까지 문제가 없습니다.

불행히도 stdout (각각 stderr)은 스크립트가 끝난 후에 만 ​​표시됩니다! 그러나, 실행 시간으로 인해, 나는 나중에 인쇄되지 않고 인쇄 될 때마다 각각의 새 행을 출력하는 것을 선호합니다.

remote = paramiko.SSHClient()
remote.set_missing_host_key_policy(paramiko.AutoAddPolicy())
remote.connect("host", username="uname", password="pwd")

# myScript produces continuous output, that I want to capture as it appears    
stdin, stdout, stderr = remote.exec_command("python myScript.py")
stdin.close()
for line in stdout.read().splitlines():
    print(line)

어떻게이 일을 성취 할 수 있습니까? 참고 : 당연히 출력을 파일로 파이프 할 수 있고 다른 ssh 세션을 통해이 파일을 '덜'처리 할 수 ​​있지만 이것은 매우 못생긴 것이며 클리너, 이상적인 pythonic 솔루션이 필요합니다 :)

해결법

  1. ==============================

    1.read ([size]) 문서에서 지정된대로 크기를 지정하지 않으면 EOF까지 읽 힙니다. 이렇게하면 명령이 끝날 때까지 스크립트가 대기하고 read ()에서 반환되고 출력이 인쇄됩니다.

    read ([size]) 문서에서 지정된대로 크기를 지정하지 않으면 EOF까지 읽 힙니다. 이렇게하면 명령이 끝날 때까지 스크립트가 대기하고 read ()에서 반환되고 출력이 인쇄됩니다.

    이 답변을 확인하십시오 : Python에서 EOF까지 루프하는 방법? File-like 오브젝트를 소모하는 방법에 대한 예제는 "While not EOF"를 수행하는 방법을 참조하십시오.

  2. ==============================

    2.나는 비슷한 문제에 직면했다. 나는 paramiko에게 get_pty = True를 추가하여 그것을 해결할 수 있었다 :

    나는 비슷한 문제에 직면했다. 나는 paramiko에게 get_pty = True를 추가하여 그것을 해결할 수 있었다 :

    stdin, stdout, stderr = client.exec_command("/var/mylongscript.py", get_pty=True)
    
  3. ==============================

    3.이 답변을 사용하는 방법에 대한 최소 및 완전한 작동 예제 (Python 3.6.1에서 테스트 됨)

    이 답변을 사용하는 방법에 대한 최소 및 완전한 작동 예제 (Python 3.6.1에서 테스트 됨)

    # run.py
    from paramiko import SSHClient
    
    ssh = SSHClient()
    ssh.load_system_host_keys()
    
    ssh.connect('...')
    
    print('started...')
    stdin, stdout, stderr = ssh.exec_command('python -m example', get_pty=True)
    
    for line in iter(stdout.readline, ""):
        print(line, end="")
    print('finished.')
    

    # example.py, at the server
    import time
    
    for x in range(10):
        print(x)
        time.sleep(2)
    

    다음을 사용하여 로컬 컴퓨터에서 실행

    python -m run
    
  4. from https://stackoverflow.com/questions/31834743/get-output-from-a-paramiko-ssh-exec-command-continuously by cc-by-sa and MIT license