背景: 我正在使用 python 和 paramiko 来自动化我每次必须为类(class)提交程序时所经历的过程。我们使用名为“handin”的命令来提交源代码,但这必须在学校计算机上完成。所以当我从家里提交代码时,我必须:sftp 进入学校服务器,将文件放在目录中,ssh 进入学校计算机,使用'handin'命令
我可以成功地将文件放到学校的机器上。当我尝试使用 exec_command('handin my files') 然后读取输出以确定下一步操作时出现问题。
所以我有
try:
(stdin, stdout, stderr) = client.exec_command(s)
except:
print 'whoops'
sys.exit()
print stdout.readlines()
但是由于某种原因这会导致死锁,脚本似乎什么都不做,我最终不得不终止整个进程(ctrl+c 不起作用)。我不确定 exec_command 是否没有正确完成(即使它正在退出 try/catch block )或者我是否遇到网络问题或其他问题。
有什么想法吗?
更新:
问题在于在执行期间与 handin 命令交互。执行命令后,handin 可能仍在运行,也可能不在运行。如果它是第一次提交它说成功,等等等等,然后完成执行。一切都很好。但是,如果我重新提交,我必须为每个文件授权覆盖 (stdin.write('y'))。
TL/DR:
如何检查 exec_command() 是否仍在运行,等待输入,并相应地从 stdout 读取 readline()?
最佳答案
我没有发现上面的代码片段有任何问题。下面的程序是一个完整的脚本,它登录到主机并运行 ls 命令来查看文件。我刚刚试过了,它对我有用。也许试试这个,看看它是否适合你。如果它不起作用,我怀疑某些特定于您的 ssh 服务器、您正在运行的命令或 paramiko 安装的问题。如果它对您有用,只需对此进行更改以转向您现有的功能并查看它在哪里中断。
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()
如果这对您有用,我的下一个建议是尝试用您尝试运行的实际 handin 命令替换“ls/”。可能命令挂起等待用户输入等。
关于Python paramiko 脚本,在 exec_command() 期间读取输出时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7680343/