Туннель Pexpect ssh с интерактивным входом в систему через прокси-сервер не принимает пароль - PullRequest
0 голосов
/ 18 января 2019

Я пишу сценарий, который должен был бы запускать удаленный сценарий на нескольких удаленных частных хостах в разных доменах.

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

cmd = 'ssh -o ProxyCommand="ssh -o StrictHostKeyChecking=no {}@a{}@{} nc {}} 22" -o StrictHostKeyChecking=no {}@a{}@{} -t sudo su'.format(username, domain, jumphost, remotehost, username, domain, remotehost)
    child = pexpect.spawn(cmd)
    child.expect('.*')
    child.sendline('yes')
    child.expect('.*')
    child.sendline('yes')
    child.expect('assword:')
    child.sendline(password)
    child.expect('assword')
    child.sendline(password)
    child.expect('root@.*# ')
    child.sendline('<execute remote code here>')

Всякий раз, когда я делаю тесты из консоли и в любой заданный момент я делаю child.interact(), я всегда получаю приглашение на ввод пароля, однако операторы ожидания всегда возвращают 0 (индекс выражения ожидания в предоставленном списке), и я получаю обратно количество байтов, которые я пишу, но при взаимодействии () я всегда получаю запрос пароля. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 18 января 2019

Я понял это - sendline () отправляет только те аргументы, которые ему передают, и символ новой строки, но также не отправляет символ возврата каретки. Все, что мне нужно было сделать, это либо sendline (пароль + '\ r'), либо send (пароль + '\ r \ n').

Я предполагал (по-видимому, неправильно), что sendline добавит \ r AND \ n в строку, а не только \ n. Пусть это будет уроком для кого-то еще, кто застрял на той же глупости.

...