问题描述
我正在使用中间host2从host1连接到host3。
host1-> host2-> host3
这是我的代码,可以正常工作:
# SSH to host2
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host2,username=host2_username)
# SSH to host3
vmtransport = ssh.get_transport()
dest_addr = (host3,22)
local_addr = (host2,22)
vmchannel = vmtransport.open_channel("direct-tcpip",dest_addr=dest_addr,src_addr=local_addr)
ssh3 = paramiko.SSHClient()
ssh3.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh3.connect(host3,username=host3_username,sock=vmchannel)
现在,我要从host3 SSH到第四台主机:
# SSH to host4
vmtransport = ssh3.get_transport()
dest_addr = (host4,22)
local_addr = (host3,src_addr=local_addr)
ssh4 = paramiko.SSHClient()
ssh4.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh4.connect(host4,username=host4_username,sock=vmchannel)
最后一个SSH由于身份验证错误而失败。 当我从host4手动SSH到host3时,它工作正常。 我注意到host3在.ssh文件夹下存储了公钥。 如何让paramiko知道使用host3上的公钥通过SSH到host4。
换句话说,paramiko是否依赖host1下的公钥来一直执行host4的嵌套SSH?如果答案是肯定的,我是否也需要将host4的公钥存储在host1上?
解决方法
是的。您必须在本地拥有所有凭据。单靠端口转发并不能使存储在中间主机上的凭据可用于身份验证。
当然,您可以使用SFTP访问/下载文件/密钥,例如:
sftp3 = ssh3.open_sftp()
with sftp3.open(".ssh/id_rsa") as key_file:
pkey = RSAKey.from_private_key(key_file)
ssh4.connect(host4,username=host4_username,sock=vmchannel,pkey=pkey)