Невозможно указать пароль для процесса с подпроцессом [python]
Я использую подпроцесс для запуска скрипта из Python. Я пробовал это
Опция 1
password = getpass.getpass()
from subprocess import Popen, PIPE, check_call
proc=Popen([command, option1, option2, etc...], stdin=PIPE, stdout=PIPE, stderr=PIPE)
proc.stdin.write(password)
proc.stdin.flush()
stdout,stderr = proc.communicate()
print stdout
print stderr
и это
вариант 2
password = getpass.getpass()
subprocess.call([command, option1, option2, etc..., password])
Ни один из них не работает, то есть пароль не отправляется в процесс. Если я использую вариант 2 и не предоставляю пароль, подпроцесс запрашивает его, и все работает.
1 ответ
Решение
Вот очень простой пример того, как использовать pexpect для этого:
import sys
import pexpect
import getpass
password = getpass.getpass("Enter password:")
child = pexpect.spawn('ssh -l root 10.x.x.x "ls /"')
i = child.expect([pexpect.TIMEOUT, "password:"])
if i == 0:
print("Got unexpected output: %s %s" % (child.before, child.after))
sys.exit()
else:
child.sendline(password)
print(child.read())
Выход:
Enter password:
bin
boot
dev
etc
export
home
initrd.img
initrd.img.old
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
selinux
srv
sys
tmp
usr
var
vmlinuz
vmlinuz.old
Здесь есть более подробные примеры.
Вы должны передать пароль в качестве значения communicate()
функция вместо stdin.write()
, вот так:
from getpass import getpass
from subprocess import Popen, PIPE
password = getpass("Please enter your password: ")
proc = Popen("command option1 option2".split(), stdin=PIPE, stdout=PIPE)
# Popen only accepts byte-arrays so you must encode the string
proc.communicate(password.encode())