我需要一种方法来捕获通过SSH运行的命令的退出状态。希望退出状态在变量内结束。我似乎无法让它工作。Python - 捕获通过SSH执行的命令的退出状态
命令会是这样简单的东西:
使用os.system( “SSH -qt主机名“须藤yum的更新列表--security> /tmp/yum_update_packagelist.txt';echo $?”)
任何人有想法?我所尝试过的所有东西根本没有任何作用,或者最终给我提供了ssh命令的退出状态,而不是底层的命令。
我需要一种方法来捕获通过SSH运行的命令的退出状态。希望退出状态在变量内结束。我似乎无法让它工作。Python - 捕获通过SSH执行的命令的退出状态
命令会是这样简单的东西:
使用os.system( “SSH -qt主机名“须藤yum的更新列表--security> /tmp/yum_update_packagelist.txt';echo $?”)
任何人有想法?我所尝试过的所有东西根本没有任何作用,或者最终给我提供了ssh命令的退出状态,而不是底层的命令。
你可能想使用SSH文库像paramiko
(或spur
,Fabric等...只是谷歌/的PyPI/SO-搜索 “Python的SSH” 来查看所有选项并选择最符合您的用例的那个)。有包含paramiko
的演示完全符合您的要求。
如果你坚持脚本命令行ssh
工具,你(一)几乎肯定要使用subprocess
代替os.system
(如os.system
文档明确地说),和(b)将需要做一些的bash脚本(假设远程端运行bash)将值传回给您(例如,将其包装在一个打印出stderr
的退出状态的单线脚本中)。
如果你只是想知道为什么你的现有代码不起作用,让我们来看看它:
os.system("ssh -qt hostname 'sudo yum list updates --security > /tmp/yum_update_packagelist.txt';echo $?")
首先,你正在运行的ssh
命令,然后单独echo $?
命令,将回显ssh
的退出状态。如果您想回显sudo
的状态,则需要将分号存入ssh
命令。 (如果你想要的yum
的状态下,sudo
内。)
其次,os.system
不看什么被打印到stdout
反正。正如文件中明确指出的那样,“退货价值是过程的退出状态”。所以,你回到echo
命令的退出状态,这个命令几乎保证为0。
因此,为了使这项工作,你需要得到回音到合适的位置,然后使用subprocess.check_output
或类似的,而不是os.system
读取标准输出,然后解析输出读取的最后一行。如果你这样做,它应该工作。但是,再一次,你不应该这样做;只需使用paramiko
或其他SSH库。
您可能想要使用Fabric API,而不是直接调用ssh
可执行文件。
从那里,看看Can I catch error codes when using Fabric to run() calls in a remote shell?
你错了回声。它在正确的地方。它执行yum命令,然后echo回显yum命令的状态,因为它回显远程系统上紧邻的任何东西。 我在验证和错误猜测期间多次验证。问题不是我没有得到正确的退出代码,而是我无法找到一种方法将退出代码放入本地系统的变量中。 – 2013-04-05 01:39:23
任何人,我决定使用SSH模块(按照你的建议使用paramiko库)来做到这一点,并立即开始工作。 – 2013-04-05 01:40:02
不,'echo $?'没有在远程系统上运行。您只需将其更改为例如'echo $ HOSTNAME'即可看到它 - 它将打印机器的主机名,而不是远程系统。它似乎工作的原因是,在大多数情况下,'ssh'的退出状态是远程命令的退出状态。但是,当你使用'ssh'和'sudo'时,了解它们的区别非常重要。如果您不知道什么是命令的组成部分,那么您将在某个时候遇到严重的问题(可能涉及漏洞百出的安全漏洞)。 – abarnert 2013-04-05 02:01:05