繁体   English   中英

为什么调用 ssh Python 子进程打破外部 bash 循环

[英]why is call to ssh with Python subprocess breaking outer bash loop

我有一个 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命令执行无误,output正确。 但是当这样调用时, myscript.sh中的循环只运行第一行输入,然后以状态 0 退出。如果我将subprocess.check_output(...)调用替换为subprocess.Popen(...)不要随后调用Popen.wait()然后外循环按预期工作并且来自ssh命令的 output 在来自 bash 脚本的任何 output 之后的某个时间被转储到标准输出。 使用Popen.wait()的行为与使用check_output时相同:bash 循环在无错误退出之前只经过一次迭代。

如果不是ssh而是使用check_output调用另一个命令,例如ls ,那么 bash 循环将按预期工作。

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

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

当@larsmans猜到ssh调用正在消耗stdin时,打破了外部bash循环。 -n选项添加到ssh命令可解决此问题:

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

问题是 ssh 从标准输入读取,因此它“吃掉”了循环中所有剩余的行。 您可以使用-n标志将其标准输入连接到任何地方:

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

在 ssh 的手册页上查找详细信息https://linux.die.net/man/1/sshhttps://man.openbsd.org/ssh

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM