1

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

命令会很简单,例如:

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

有人有想法吗?我尝试过的一切要么根本不起作用,要么最终给了我 ssh 命令的退出状态,而不是底层命令。

4

2 回答 2

0

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

从那里,查看在远程 shell 中使用 Fabric to run() 调用时可以捕获错误代码吗?

于 2013-04-05T00:13:39.423 回答
0

您可能想要使用 SSH 库,例如paramiko(或Fabric等……只需 google/PyPI/SO 搜索“Python SSH”即可查看所有选项并选择最符合您的用例的选项)。包含的演示正是您想要做的。spurparamiko

如果您坚持编写命令行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 库。

于 2013-04-05T00:15:11.380 回答