Python 没有 'expect' 或 'pexpect' 的脚本自动交互

Python script automatic interaction without 'expect' or 'pexpect'

我正在尝试编写一个 python 脚本,通过用户交互调用 bash 脚本。出于安全原因,我不能在任何服务器上安装 expect 或 pexpect -- 我们有非常严格的政策。

bash 脚本存在于多个服务器上(通过 ssh 调用),因此无法修改此脚本。

我的 bash 脚本有问题的部分是这样的:

echo ""
echo "Are you sure you want to continue and  the session?"
echo ""
echo -e "Press enter to continue or CTRL-C to abort...\c"
echo -e "Press enter to continue or CTRL-C to abort..."
read line
echo ""
echo "Are you ABSOLUTELY positive?"
echo ""
echo -e "Press enter to continue or CTRL-C to abort...\c"
read line
echo ""

然后从 python 开始,现在我尝试了 subprocess.run() 和 subprocess.Popen()

的多个选项

我浏览了所有这些帖子: How do I write to a Python subprocess' stdin?

Constantly print Subprocess output while process is running

None 似乎有效。我所有的最佳尝试都可以打印 Popen.stdout 的文件,然后似乎挂在

read line

即使我做了类似的事情:

with subprocess.Popen("confirm.sh", shell = False, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = False) as con:
    try:
         for line in iter(con.stdout.readline, ""):

            if "enter" in line.decode().strip().split():
                print(line.decode().strip())
                sleep(2)
                con.stdin.write('\n')  # or con.communicate('\n')

我收到此错误“I/O 对已关闭文件的操作。”或脚本挂起,具体取决于方法。

似乎 subprocess.run() 或 subprocess.Popen() 看起来他们想要完成该过程并且不允许像 pexpect.spawn() 那样的交互。

有解决这个问题的想法吗?

想到两个选项:

  1. 使用shell发送输入:
con = subprocess.Popen("{ echo; echo; } | ./confirm.sh", shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = False)

主要变化是 { echo; echo; } | 位发送两个换行符到 ./confirm.sh 的输入流和 shell = True

的变化
  1. 使用python's communicate方法将两个换行符发送到标准输入:
con = subprocess.Popen("./confirm.sh", shell = False, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = False)
out, err = con.communicate(input='\n\n')

Julia Schwarz's communicate(input='\n') 部分致敬。