【问题标题】:why is call to ssh with Python subprocess breaking outer bash loop为什么使用 Python 子进程调用 ssh 会破坏外部 bash 循环
【发布时间】:2013-03-19 14:24:49
【问题描述】:

我有一个 bash 脚本 myscript.sh:

#!/bin/bash
while read line; do
    myprog.py
done

调用python程序myprog.py

#!/usr/bin/env python
import subprocess
output = subprocess.check_output(['ssh', 'user@host', 'cmd'])

子进程调用的ssh命令执行无误,输出正确。但是当这样调用时,myscript.sh 中的循环仅运行第一行输入,然后以状态 0 退出。如果我将 subprocess.check_output(...) 调用替换为 subprocess.Popen(...) 并且 不要随后调用Popen.wait(),然后外部循环按预期工作,ssh 命令的输出在 bash 脚本的任何输出之后的一段时间内被转储到标准输出。 Popen.wait() 的行为与 check_output 的行为相同:bash 循环在退出之前只经过一次迭代而不会出错。

如果不是ssh 另一个命令,例如ls,用 check_output 调用,然后 bash 循环按预期工作。

谁能帮我理解为什么显示的代码没有按预期工作?

注意:这是我正在尝试做的简化版本,尽管我确实遇到了与此代码相同的行为。实际上,我在 bash 脚本中使用“$line”做一些事情,并且子进程调用包含在 try/except 块中。

【问题讨论】:

  • 有根据的猜测:ssh 进程正在消耗标准输入。尝试将stdin=open("/dev/null") 传递给check_output
  • 感谢@larsmans 我同时也有大致相同的想法。在 ssh 命令中添加 -n 参数就可以了!

标签: python bash ssh subprocess


【解决方案1】:

正如@larsmans 猜测的那样,ssh 调用正在消耗标准输入,从而破坏了外部 bash 循环。将-n 选项添加到ssh 命令解决了这个问题:

output = subprocess.check_output(['ssh', '-n', 'user@host', 'cmd'])

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2018-06-18
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多