我需要一种方法来从通过SSH运行的命令中捕获退出状态。希望退出状态最终在变量中。我似乎无法让它工作。
命令会很简单:
os.system(“ssh -qt hostname'sudy yum list updates --security> /tmp/yum_update_packagelist.txt';echo $?”)
有人有想法吗?我尝试的所有东西要么根本没有用,要么最终给我ssh命令的退出状态,而不是基础命令。
答案 0 :(得分:0)
您可能希望使用Fabric api而不是直接调用ssh
可执行文件。
从那里,查看Can I catch error codes when using Fabric to run() calls in a remote shell?
答案 1 :(得分:0)
你可能想要使用像paramiko
(或spur
,Fabric等的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库。