mac*_*gor 11 python ssh paramiko
背景:我正在使用python和paramiko来自动化我每次必须交给一个类的程序时经历的过程.我们使用一个名为"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()
Run Code Online (Sandbox Code Playgroud)
但是由于某些原因导致死锁,脚本似乎什么都不做,我必须最终杀死整个过程(ctrl + c不起作用).我不确定exec_command是否未正确完成(即使它已经退出try/catch块)或者我是否有网络问题或者是什么.
有任何想法吗?
更新:
问题在于在执行期间与handin命令交互.执行命令后,handin可能仍在运行,也可能不运行.如果它第一次提交它说成功,等等等等,并完成执行.一切都很好.但是如果我重新提交,我必须为每个文件授权覆盖(stdin.write('y')).
TL/DR:
如何相应地检查exec_command()是否仍在运行,等待输入和stdout的readline()?
bdk*_*bdk 12
我没有看到上面的代码snippit有什么问题.下面的程序是一个完整的脚本,它登录到主机并运行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()
Run Code Online (Sandbox Code Playgroud)
如果这对您有用,我的下一个建议是尝试用您尝试运行的实际handin命令替换'ls /'.它可能是命令挂起等待用户输入等.
问题可能是远程命令正在等待输入(它希望你写一些东西到stdin,不知道你不会去,除非你这么说).尝试stdin.channel.shutdown_write()(我相信stdin.close()自己不会做的伎俩:那只会导致冲洗)
| 归档时间: |
|
| 查看次数: |
41059 次 |
| 最近记录: |