我需要一种从通过 SSH 运行的命令中捕获退出状态的方法。希望退出状态以变量结束。我似乎无法让它工作。
命令会很简单,例如:
os.system("ssh -qt hostname 'sudo yum list updates --security > /tmp/yum_update_packagelist.txt';echo $?")
有人有想法吗?我尝试过的一切要么根本不起作用,要么最终给了我 ssh 命令的退出状态,而不是底层命令。
您可能想要使用Fabric api 而不是直接调用ssh
可执行文件。
您可能想要使用 SSH 库,例如paramiko
(或Fabric等……只需 google/PyPI/SO 搜索“Python SSH”即可查看所有选项并选择最符合您的用例的选项)。包含的演示正是您想要做的。spur
paramiko
如果您坚持编写命令行ssh
工具的脚本,您 (a) 几乎肯定想要使用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。
因此,要完成这项工作,您需要将 echo 放到正确的位置,然后使用subprocess.check_output
或类似的方法代替读取 stdout os.system
,然后解析该输出以读取最后一行。如果你做了所有这些,它应该工作。但同样,你不应该这样做。只需使用paramiko
或其他 SSH 库。