Как мне записать пароль?

У меня есть следующий код (обновлен, чтобы включить pexpect):

import sys
import subprocess
import pexpect
print "0"
ssh = subprocess.Popen("ssh -A -t username1@200.1.2.3 ssh -A -X username2@10.1.2.3",
        shell = True,
        stdout = subprocess.PIPE,
        stderr = subprocess.PIPE).communicate()
print "1"
child = pexpect.spawn(ssh)
print "2"
child.expect ('password')
print "3"
child.sendline ('password2')
print "4"
result = ssh.stdout.readlines()
if result == []:
        error = ssh.stderr.readlines()
        print >>sys.stderr, "ERROR: %s" % error
else:
        print result

Когда я запускаю его, я вижу напечатанный ноль, за которым следует подсказка пароля, отображаемая на экране. Строка, которая печатает One, никогда не выполняется, поэтому следующий код pexpect тоже не выполняется. Я могу ввести пароль как пользователь, но затем он зависает. Когда я убиваю его с помощью Ctrl+C, перед возвращением в командную строку появляется 2-й баннер входа в систему с приглашением 2nd Password. Может кто-нибудь объяснить, как получить 1-й пароль, чтобы программа могла отправлять пароль вместо пользователя? Кроме того, кто-то может объяснить, почему я не получаю переменную результата, пока я не убью программу?

2 ответа

Решение

Под руководством Йоханнеса Холмберга:

import pexpect

prompt = "cisco_prompt"

def start_log():
        global child
        child.logfile = open("/tmp/mylog", "w")

def stop_log():
        global child
        f = open('/tmp/mylog', 'r')
        for line in f:
                cleanedLine = line.strip()
                if cleanedLine: # is not empty
                        print(cleanedLine)
        f.close()
        child.logfile.close

ssh_cmd = "ssh -A -t username1@200.1.2.3 ssh -A -X username2@10.1.2.3"
child = pexpect.spawn(ssh_cmd, timeout=30)
print "Waiting for 1st password prompt"
child.expect ('password')
child.sendline ('password1')
print "Waiting for 2nd password prompt"
child.expect ('password')
child.sendline ('password2')
start_log()
child.expect (prompt)
child.sendline ('conf t')
stop_log()
start_log()
child.expect ('(config)')
stop_log()
print "Ready for more code"
child.close
print "END"

Запрос пароля не записывается на стандартный вывод. Вам понадобится что-то вроде pexpect, чтобы захватить это. В этой теме есть дополнительная информация: Отправка пароля через SSH или SCP с помощью подпроцесса. Открыть

Изменить: Что касается вашего обновленного кода pexpect, прежде всего, если вы прочитаете документацию для подпроцесса, вы увидите, что connect () ожидает завершения процесса, поэтому ваша программа зависает до тех пор, пока вы не завершите сеанс ssh. И ваш вызов pexpect.spawn выглядит неправильно, он ожидает строку, а не объект Popen. Вам не нужен подпроцесс вообще здесь.

Другие вопросы по тегам