Как перенаправить данные на «getpass», как ввод пароля? - PullRequest
6 голосов
/ 28 января 2011

Я пишу скрипт на Python для запуска какой-то команды. Некоторые из этих команд требуют, чтобы пользователь ввел пароль, я попытался ввести данные в их стандартный ввод, но это не работает, вот две простые программы на Python, представляющие проблему

input.py

import getpass

print raw_input('text1:')
print getpass.getpass('pass1:')
print getpass.getpass('pass2:')

put_data.py

import subprocess
import getpass

def run(cmd, input=None):
    stdin=None
    if input:
        stdin=subprocess.PIPE
    p = subprocess.Popen(cmd, shell=True, stdin=stdin)
    p.communicate(input)
    if p.returncode:
        raise Exception('Failed to run command %r' % cmd)

input ="""text1
password1
password2
"""
run('python test.py', input)

А вот и вывод

[guest@host01 ~]# python put_data.py 
text1:text1
pass1:

Это просто остановится на поле pass1. Вот проблема, почему я не могу поместить данные в stdin для подачи данных в поле пароля? Как я могу записать данные в поля пароля?

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Для таких случаев вам необходим модуль pexpect .

Pexpect - это модуль Python для порождения дочерних приложений и автоматического управления ими.Pexpect можно использовать для автоматизации интерактивных приложений, таких как ssh, ftp, passwd, telnet и т. Д.

0 голосов
/ 19 сентября 2011

Определенно нет необходимости в двух классах, чтобы сделать что-то подобное.Все, что вам нужно сделать, это создать другой метод в put_data.py с именем init_ (), а затем сделать что-то вроде:

x = raw_input('text1:')
y = getpass.getpass('pass1:')
z = getpass.getpass('pass2:')

Затем вы можете просто использовать pexpect длясделай все остальное:

child = pexpect.spawn(x, timeout=180)
while True:
   x = child.expect(["(current)", "new", "changed", pexpect.EOF, pexpect.TIMEOUT])
   if x is 0:
      child.sendline(y)
      time.sleep(1)
   if x is 1:
      child.sendline(z)
      time.sleep(1)
   if x is 2:
      print "success!"
      break

Тада!Конечно, вы получите кучу ошибок с таким кодом.Вы должны всегда использовать предоставленные методы, если вы используете linux, может быть проще запустить os.system ("passwd") и позволить оболочке позаботиться обо всем остальном.Кроме того, если это вообще возможно, всегда избегайте использования getpass, это устарелый устаревший метод, который может испортить ситуацию в будущем.

...