[英]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/ssh和https://man.openbsd.org/ssh
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.