【问题标题】:subprocess ssh command fails for some commands but not others (command works in terminal)某些命令的子进程 ssh 命令失败,但其他命令失败(命令在终端中工作)
【发布时间】:2013-12-28 05:02:21
【问题描述】:

作为python脚本的一部分,我希望捕获通过ssh执行的shell命令的输出,即

ssh User@999 screen -list

如果我直接在终端中执行上述命令,我会得到我需要的结果。但是,如下所示通过subprocess.check_output 执行时,我收到non-zero exit status 1 错误。

我能够通过 ssh 执行其他命令并毫无问题地捕获输出。
screen -list 是否有一些不喜欢以这种方式被调用的特定内容?


import subprocess 

srvr = 'User@999.99.999.9'

print("CMD 1: ===============")
cmd1 = "ssh " + srvr + " ls -l"
print ("COMMAND IS .....  " + cmd1 + "\n")
out1 = subprocess.check_output(cmd1, shell=True)
print(out1 + "\n")

print("CMD 2: ===============")
cmd2 = "ssh " + srvr + " screen -list"
print ("COMMAND IS .....  " + cmd2 + "\n")
out2 = subprocess.check_output(cmd2, shell=True)
print(out2 + "\n")

错误:

subprocess.CalledProcessError: Command '['ssh User@999.99.999.9 screen', '-list']' returned non-zero exit status 1

【问题讨论】:

  • 您是否尝试过从子进程的stderr 捕获更多输出?这可能会为您提供有关正在发生的事情的线索...

标签: python ssh subprocess gnu-screen


【解决方案1】:

subprocess.check_output检查子进程的退出码;如果退出代码不为零,则会引发异常。

如果您不关心退出代码,请使用subprocess.Popen.communicate

out1, err1 = subprocess.Popen(cmd1,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE).communicate()

【讨论】:

  • 我正要更新我的问题,将; exit 0 附加到我的命令中可以获得所需的输出。这种方法有什么缺点吗?
  • @RicardoSaporta,如果您不关心退出代码,我认为没关系。顺便说一句,它在 Windows cmd 中不起作用。
【解决方案2】:

subprocess.check_output() 应该是这样工作的。见:http://docs.python.org/2/library/subprocess.html

您服务器上的命令返回一个非零返回码,因此引发了相应的异常CalledProcessError

【讨论】:

  • 虽然你说的是准确的,但它确实没有提供任何有用的信息
  • 很抱歉。在旅途中写作。
猜你喜欢
  • 2019-07-06
  • 2021-01-06
  • 2018-06-09
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多