Python - 捕获通过SSH执行的命令的退出状态

时间:2013-04-05 00:06:01

标签: python ssh exit-code

我需要一种方法来从通过SSH运行的命令中捕获退出状态。希望退出状态最终在变量中。我似乎无法让它工作。

命令会很简单:

os.system(“ssh -qt hostname'sudy yum list updates --security> /tmp/yum_update_packagelist.txt';echo $?”)

有人有想法吗?我尝试的所有东西要么根本没有用,要么最终给我ssh命令的退出状态,而不是基础命令。

2 个答案:

答案 0 :(得分:0)

您可能希望使用Fabric api而不是直接调用ssh可执行文件。

从那里,查看Can I catch error codes when using Fabric to run() calls in a remote shell?

答案 1 :(得分:0)

你可能想要使用像paramiko(或spurFabric等的SSH库...只需google / PyPI / SO搜索“Python SSH”即可查看全部选项并选择最符合您用例的选项)。 paramiko中包含的演示完全符合您的要求。

如果您坚持使用命令行ssh工具编写脚本,那么您(a)几乎肯定希望使用subprocess代替os.system(明确os.system个文档())和(b)将需要做一些bash脚本(假设远程端正在运行bash)将值传递给你(例如,将其包装在单行程脚本中,打印退出状态{{ 1}})。

如果您只是想知道为什么现有代码不起作用,让我们来看看它:

stderr

首先,您正在运行os.system("ssh -qt hostname 'sudo yum list updates --security > /tmp/yum_update_packagelist.txt';echo $?") 命令,然后运行单独的ssh命令,该命令将回显echo $?的退出状态。如果要回显ssh的状态,则需要在sudo命令中输入分号。 (如果您想要ssh内的yum的状态。)

其次,os.system不会查看打印到sudo的内容。正如文档明确指出的那样,“返回值是流程的退出状态”。因此,您将返回stdout命令的退出状态,该命令几乎保证为0。'

因此,要使其工作,您需要将回声放到正确的位置,然后使用echo或类似代码而不是subprocess.check_output来读取标准输出,然后解析该输出阅读最后一行。如果你做了所有这些,它应该工作。但同样,你不应该这样做;只需使用os.system或其他SSH库。