Подпроцесс Python + scp - не может прочитать весь вывод - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь SCP-файл между компьютерами, и мне нужно потерпеть неудачу, когда пользователь не настроил закрытый / публичный сертификат для входа без пароля. К сожалению, используя subprocess.Popen, я не могу понять, как захватить следующий вывод:

The authenticity of host '***' can't be established.
RSA key fingerprint is ***.
Are you sure you want to continue connecting (yes/no)

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

Вот пример кода:

proc = subprocess.Popen(['scp', 'user@server:/location/file.txt', '/someplace/file.txt',
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)
proc.wait()
print 'result: %s' % repr(proc.stderr.readline())

Я пробовал много других перестановок. Это все еще подсказывает мне, а не Python вводить да / нет. По крайней мере, когда я печатаю no, я получаю:

result: 'Host key verification failed.\r\n'

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

'The authenticity of host '***' can't be established' означает, что машине, с которой вы подключаетесь, не было приказано сохранить идентификационные данные других сторон (сервера) в файле known_hosts, и он спрашивает, доверяете ли вы машине.Вы можете изменить ssh-клиент так, чтобы он автоматически добавлялся без запроса.

Попробуйте:

proc = subprocess.Popen(['scp', '-o BatchMode=yes',
                                'user@server:/location/file.txt',
                                '/someplace/file.txt'],
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)
proc.wait()
print 'result: %s' % repr(proc.stderr.readline())

С приведенным выше кодом я получаю:

me@myMachine:~$ python tmp.py 
result: 'Host key verification failed.\r\n'
me@myMachine:~$

Если я использую отключить StrictHostKeyChecking, я получаю:

me@myMachine:~$ python tmp.py
result: 'Permission denied (publickey,password,keyboard-interactive).\r\n'
me@myMachine:~$ python tmp.py

Таким образом, похоже, что он печатает первую строку из stderr с включенным BatchMode:)

2 голосов
/ 09 июня 2011

Я сталкивался с чем-то похожим раньше, хотя в моем случае это было действительно полезно.Я верю, что ssh и друзья на самом деле не читают stdin и не печатают на stdout или stderr, они делают забавные вещи, чтобы подключиться к терминалу, в котором вы работаете напрямую.

Я считаю, что онипредполагается, что он может общаться с пользователем напрямую, даже если он запускается через сценарии оболочки-оболочки, потому что пользователь знает пароль, а не вызывающий сценарий (и, вероятно, он намеренно не хочет, чтобы вызывающие сценарии имели возможность перехватить пароль).

[Изменить, чтобы добавить]: Согласно справочной странице в моей системе, scp имеет флаг, который может делать то, что вы хотите:

 -B      Selects batch mode (prevents asking for passwords or passphrases).
...