Я переписываю скрипт Bash, который я написал на Python. Суть этого сценария была
ssh -t first.com "ssh second.com very_remote_command"
У меня проблема с вложенной аутентификацией с paramiko. Я не смог найти примеров, относящихся к моей конкретной ситуации, но я смог найти примеры с sudo на удаленном хосте.
Первый метод пишет в stdin
ssh.connect('127.0.0.1', username='jesse', password='lol')
stdin, stdout, stderr = ssh.exec_command("sudo dmesg")
stdin.write('lol\n')
stdin.flush()
Второй создает канал и использует сокетоподобные send и recv .
Мне удалось заставить stdin.write работать с sudo , но он не работает с ssh на удаленном хосте.
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('first.com', username='luser', password='secret')
stdin, stdout, stderr = ssh.exec_command('ssh luser@second.com')
stdin.write('secret')
stdin.flush()
print '---- out ----'
print stdout.readlines()
print '---- error ----'
print stderr.readlines()
ssh.close()
... печать ...
---- out ----
[]
---- error ----
['Pseudo-terminal will not be allocated because stdin is not a terminal.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied, please try again.\r\n', 'Permission denied (publickey,password,keyboard-interactive).\r\n']
Ошибка псевдотерминала напомнила мне флаг -t в моей исходной команде, поэтому я переключился на второй метод, используя Channel. Вместо ssh.exec_command и более поздних версий у меня есть:
t = ssh.get_transport()
chan = t.open_session()
chan.get_pty()
print '---- send ssh cmd ----'
print chan.send('ssh luser@second.com')
print '---- recv ----'
print chan.recv(9999)
chan = t.open_session()
print '---- send password ----'
print chan.send('secret')
print '---- recv ----'
print chan.recv(9999)
... но он печатает '---- send ssh cmd ----' и просто зависает, пока я не завершу процесс.
Я новичок в Python и не слишком разбираюсь в сетях. В первом случае, почему отправка пароля работает с sudo , но не с ssh ? Различаются ли подсказки? Paramiko - даже подходящая библиотека для этого?