2013-04-05 268 views
1

我需要一种方法来捕获通过SSH运行的命令的退出状态。希望退出状态在变量内结束。我似乎无法让它工作。Python - 捕获通过SSH执行的命令的退出状态

命令会是这样简单的东西:

使用os.system( “SSH -qt主机名“须藤yum的更新列表--security> /tmp/yum_update_packagelist.txt';echo $?”)

任何人有想法?我所尝试过的所有东西根本没有任何作用,或者最终给我提供了ssh命令的退出状态,而不是底层的命令。

回答

0

你可能想使用SSH文库像paramiko(或spurFabric等...只是谷歌/的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库。

+0

你错了回声。它在正确的地方。它执行yum命令,然后echo回显yum命令的状态,因为它回显远程系统上紧邻的任何东西。 我在验证和错误猜测期间多次验证。问题不是我没有得到正确的退出代码,而是我无法找到一种方法将退出代码放入本地系统的变量中。 – 2013-04-05 01:39:23

+0

任何人,我决定使用SSH模块(按照你的建议使用paramiko库)来做到这一点,并立即开始工作。 – 2013-04-05 01:40:02

+0

不,'echo $?'没有在远程系统上运行。您只需将其更改为例如'echo $ HOSTNAME'即可看到它 - 它将打印机器的主机名,而不是远程系统。它似乎工作的原因是,在大多数情况下,'ssh'的退出状态是远程命令的退出状态。但是,当你使用'ssh'和'sudo'时,了解它们的区别非常重要。如果您不知道什么是命令的组成部分,那么您将在某个时候遇到严重的问题(可能涉及漏洞百出的安全漏洞)。 – abarnert 2013-04-05 02:01:05

相关问题