Python3 пишет в консоль после subprocess.call - PullRequest
0 голосов
/ 28 июня 2018

Я пишу скрипт на Python3, который делает subprocess.call, и этот вызов требует, чтобы пользователь написал пароль. Я хочу, чтобы скрипт вызывал подпроцесс, а затем автоматически записывал пароль, но пока у меня ничего не получилось. Я выполняю его с компьютера с Linux, если это поможет.

Я пробовал с Popen и Pipe

p = Popen("Command that when executed requires me to input a password", shell=True, stdin=PIPE) p.stdin.write(PASSWORD.encode("UTF-8"))

Это выдает ошибку о том, что пароль не может быть прочитан (имеется в виду, по крайней мере, он завершает процесс)

, а также с обычным subprocess.call

subprocess.call(COMMAND) sys.stdin.write(PASSWORD)

В этом случае он ждет, пока я не нажму клавишу ВВОД, а затем выполняет следующую строку.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Ожидается, что пароль не будет считываться из файла, когда он запрашивается в интерактивном режиме, а только из терминала.

В Unix / Linux обычно программы, запрашивающие пароль, действительно читают из /dev/tty вместо стандартного ввода. Простой способ подтвердить это - написать:

echo password | path/to/command_asking_for_password

Если он блокирует ожидание пароля, вероятно, пароль читается из /dev/tty.

Что можно сделать?

  • читать документы. Некоторые программы имеют специальные опции для передачи пароля непосредственно в качестве параметра командной строки или для принудительного чтения из stdin
  • использовать псевдо-терминал. Это немного сложнее, чем простое перенаправление и непереносимость вне мира Linux / Unix, но подчиненная часть pty рассматривается программой как ее реальная /dev/tty.

    import pty
    import os
    import subprocess
    ...
    master, slave = pty.openpty()
    p = Popen("Command that when executed requires me to input a password", shell=True, stdin=slave)
    os.write(master, PASSWORD.encode("UTF-8"))
    ...
    p.wait()
    os.close(master)
    os.close(slave)
    
0 голосов
/ 28 июня 2018

Попробуйте:

p1 = subprocess.Popen(['echo','PASSWORD'], stdout=PIPE)
subprocess.Popen("Command that when executed requires me to input a password", stdin=p1.stdout)
p1.stdout.close()

сначала вы что-то выводите в канал, который используется как вход для второго подпроцесса

...