Piping bash commands using Python subprocess.call - Syntax error: "|" unexpected

Piping bash commands using Python subprocess.call - Syntax error: "|" unexpected

我在使用 subprocess.call 测试管道时遇到了以下问题。 例如,使用用户作为字符串和文本文件的自动 ssh。 该管道使用字符串(示例 1)完美运行,但在打开文本文件以检查用户时失败(示例 2)。 从文件中传递值时是否有限制?

示例 1: $ python3 script.py 我的主机

import subprocess 
import sys
host = sys.argv[1]
for j in range(0, 2):  
  words = ['test1', 'test2']
  user = words[j]
  print(user)
  print('Loggin in %s...' % repr(user))
  subp = subprocess.call(['echo %s | ssh %s' % (user, host)], 
  shell=True, stdout=None, stderr=None)

输出:

测试1

正在尝试'test1'...

已登录

测试2

正在尝试'test2'...

已登录

示例 2: $ python3 script.py myhost users.txt

import subprocess 
import sys
host = sys.argv[1]
user_list = sys.argv[2]
with open(user_list) as usr:
    user = usr.readline()
    cnt = 0
    while user:
       print(user.strip())
       user = usr.readline()
       subp = subprocess.call(['echo %s | ssh %s' % (user, host)],
       shell=True, stdout=None, stderr=None)
       cnt += 1

输出:

测试1

/bin/sh:2:语法错误:“|”意外

测试2

/bin/sh:2:语法错误:“|”意外

以防万一有人遇到这个问题,我最终通过删除第一个 readline、添加一个 strip 并修改 while 条件来修复:

with open(user_list) as usr:
    cnt = 0
    while usr:
       line = usr.readline()
       user = line.strip()
       subp = subprocess.call(['echo %s | ssh %s' % (user, host)],
       shell=True, stdout=None, stderr=None)
       cnt += 1