使用 Paramiko 从 SSH 跳转主机加载密钥

Posted

技术标签:

【中文标题】使用 Paramiko 从 SSH 跳转主机加载密钥【英文标题】:Loading key from an SSH jumphost using Paramiko 【发布时间】:2021-01-27 09:27:00 【问题描述】:

我正在使用中间 host2 从 host1 连接到 host3。

主机1-->主机2-->主机3

这是我运行良好的代码:

# 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, 22)
vmchannel = vmtransport.open_channel("direct-tcpip", dest_addr=dest_addr, 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 下的公钥来执行嵌套的 SSH 到 host4?如果答案是肯定的,我是否也需要将 host4 的公钥存储在 host1 上?

【问题讨论】:

【参考方案1】:

是的。您必须在本地拥有所有凭据。单独的端口转发不会使存储在中间主机上的凭据可用于身份验证。

当然,您可以使用 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)

【讨论】:

以上是关于使用 Paramiko 从 SSH 跳转主机加载密钥的主要内容,如果未能解决你的问题,请参考以下文章

使用 Paramiko 或其他 Python 库通过 SSH 跳转服务器远程登录网络设备

带有 Paramiko 的嵌套 SSH 退出 while 循环

PYTHON模块paramiko模块与主机SSH连接

使用Paramiko库ssh远程主机

paramiko模块学习

python 在ssh_config上定义的远程主机上使用paramiko运行命令