Python paramiko script, problems reading output during exec_command()

喜夏-厌秋 提交于 2019-11-29 17:57:12

问题


Background: I am using python and paramiko to automate the process I go through everytime I have to hand in a program for a class. We use a command called "handin" to submit source code, but this must be done from a school computer. So when I submit code from home, I have to: sftp into school servers, put the files in a dir, ssh into school computer, use 'handin' command

I can successfully put files onto the school machines. The problem occurs when I try to use exec_command('handin my files') and then read the output to determine the next action.

so I have

try:
   (stdin, stdout, stderr) = client.exec_command(s)
except:
   print 'whoops'
   sys.exit()
print stdout.readlines()

But this causes a deadlock for some reason, the script appears to be doing nothing and I have to eventually kill the entire process (ctrl+c doesnt work). Im not sure if exec_command is not completing correctly (even though it is getting out of the try/catch block) or if im having network problems or what.

Any ideas?

update:

The problem is with interacting with the handin command during execution. After executing the command, handin may or may not still be running. If its the first time submitting it says success, blah blah, and finishes executing. All is well. But if I am re-submitting I have to authorize an overwrite (stdin.write('y')) for each file.

TL/DR:

How do I check if a exec_command() is still running, waiting for input, and readline() from stdout accordingly?


回答1:


I don't see anything wrong with the code snippit above. The program below is a complete script which logs into a host and runs the ls command to view files. I just tried it and it works for me. Perhaps try this and see if it works for you. If it does not work, I suspect some issue specific to either your ssh server, command you are running, or paramiko installation. If it does work for you, its just a matter of making changes to this to move towards your existing functionality and see where it breaks.

import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('<ip address here>',username='<username here>',password='<password here>')
stdin,stdout,stderr = ssh.exec_command("ls /")
print stdout.readlines()

If that works for you my next suggestion would be to try replacing the 'ls /' with the actual handin command you are trying to run. Its possible that command is hanging waiting for user input, etc.




回答2:


The problem might be that the remote command is waiting for input (it expects you to write something to stdin, not knowing that you aren't going to unless you tell so). Try stdin.channel.shutdown_write() (I believe stdin.close() by itself won't do the trick: that will only cause a flush)




回答3:


To workaround this and get the output of Ifconfig, you may wanna try to use the option get_pty=True

e.g:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def MonitorProcess():
    ssh.connect('10.2.0.230', username='ibmsys1', password='passw0rd', timeout=5)
    stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig', timeout=3, get_pty=True)
    #stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig') -> simple exec ex.
    print stdout.read()

MonitorProcess()



回答4:


This is an old thread but I have seen this issue as well. This is due to a bug in Paramiko which it cannot process large STDOUT from the remote command so it hangs.

Ref: https://github.com/paramiko/paramiko/issues/515

Possible Solution: https://gist.github.com/matjohn2/2c1c4988e17112a34f310667e0ff6e7e



来源:https://stackoverflow.com/questions/7680343/python-paramiko-script-problems-reading-output-during-exec-command

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!