我正在重写我写成 Python 的 Bash 脚本。那个剧本的关键是
ssh -t first.com "ssh second.com very_remote_command"
我在使用 paramiko 进行嵌套身份验证时遇到问题。我无法找到任何处理我的确切情况的示例,但我能够在远程主机上找到使用sudo的示例。
第一种方法写入标准输入
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 甚至是正确的库吗?