【发布时间】:2021-05-15 09:22:50
【问题描述】:
我在 python 中使用子进程来执行一个自定义 vpn 命令,该命令除了要执行的密码。 下面是询问密码的命令:
./vpn -u <user_id> -d "description" /var/tmp/1.txt
password: XXXX
下面是 vpn shell 命令,非常适合上面的命令。
/usr/bin/expect -c 'spawn ./vpn -u <user_id> -d "description" /var/tmp/1.txt; expect "Password"; send "<Password here>\r"; interact'
在 python 中,我试图通过下面的子进程模块实现相同的效果,下面执行的脚本是输出。
"(b"\x1b[31m\xe2\x9c\x97 无法从控制台读取'user id'密码。\x1b[0m""
import subprocess
args = ["./vpn", "-u", "<user_id>", "-d", "description", "/var/tmp/1.txt"]
# args = ['sudo','cat', '/var/tmp/1.txt']
proc = subprocess.Popen(args,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
proc.stdin.write('<passowrd>'.encode())
stdout, stderr = proc.communicate()
print(stdout)
注意:如果我在写密码之前使用 time.sleep(2),它会提示我在控制台中输入密码而没有任何错误,我的目标是在脚本中提供密码。
在python中有没有更好的方法来传递shell命令,因为这很长,或者在子进程模块中提供密码无缝执行。
【问题讨论】:
-
“vpn”可执行文件是否有任何类型的非交互式密码选项?就像从文件或环境变量中读取它一样?
-
不,这是一个自定义二进制文件,没有其他选项可以提供密码。
标签: python python-3.x python-2.7 subprocess