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() 那样的交互。
有解决这个问题的想法吗?
想到两个选项:
- 使用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
的变化
- 使用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')
部分致敬。
我正在尝试编写一个 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() 那样的交互。
有解决这个问题的想法吗?
想到两个选项:
- 使用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
- 使用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')
部分致敬。