Я пишу сценарий, который должен был бы запускать удаленный сценарий на нескольких удаленных частных хостах в разных доменах.
Каждый из хостов является изолированным от остальной инфраструктуры. Они работают в частном сегменте сети, который доступен только через прокси-сервер, через который мне нужно через 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 (индекс выражения ожидания в предоставленном списке), и я получаю обратно количество байтов, которые я пишу, но при взаимодействии () я всегда получаю запрос пароля. Что мне здесь не хватает?