python 3 paramiko ssh代理通过第三台主机上的远程命令在跳转主机上转发

时间:2018-06-21 21:02:17

标签: python python-3.x ssh paramiko ssh-tunnel

痛苦!

情况:通过 jump.host 连接到 destination.host ,并在 destination.host 上运行命令, other.host 的背景(在此主机上需要我的ssh密钥)。

方案:客户端-> jump.host-> destination.host ---在另一台主机上需要带有ssh键的remote_command-> another.host

#!/usr/bin/python

import paramiko

jumpHost=paramiko.SSHClient()
sshKey = paramiko.RSAKey.from_private_key_file('path.to.key/file', password = 'the.passphrase')
jumpHost.set_missing_host_key_policy(paramiko.AutoAddPolicy())
jumpHost.connect('jump.hostname',username='foo', pkey = sshKey)
jumpHostTransport = jumpHost.get_transport()
dest_addr = ('destination.hostname', 22) 
local_addr = ('jump.hostname', 22) 
jumpHostChannel = jumpHostTransport.open_channel("direct-tcpip", dest_addr, local_addr)

destHost=paramiko.SSHClient()
destHost.set_missing_host_key_policy(paramiko.AutoAddPolicy())
destHost.connect('destination.hostname', username='foo', sock=jumpHostChannel, pkey=sshKey)
destHostAgentSession = destHost.get_transport().open_session()
paramiko.agent.AgentRequestHandler(destHostAgentSession)

stdin, stderr, stdout = destHost.exec_command("my.command.which.connects.to.another.host")

print(stdout.read())
print(stderr.read())

destHost.close()
jumpHost.close()

如果在destination.host上运行“本地”命令,则上述代码效果很好。 uname,whoami,主机名,ls等...但是,如果我运行命令,该命令在后台连接到需要我的ssh密钥的另一台主机,则会在错误中引发代码:

引发AuthenticationException(“无法连接到SSH代理”) paramiko.ssh_exception.AuthenticationException:无法连接到SSH代理

如果我通过腻子连接在同一条链上,则效果很好。

有人可以给我提示解决我的问题吗?

提前。

1 个答案:

答案 0 :(得分:0)

假设:您的键可跨跳转主机和目标主机使用。

在这种情况下,创建本地代理即可。您可以先通过外壳手动创建它,然后通过iPython对其进行测试。

eval `ssh-agent`; ssh-add <my-key-file-path>

以编程方式可以做到这一点-

# Using shell=True is not a great idea because it is a security risk.
# Refer this post - https://security.openstack.org/guidelines/dg_avoid-shell-true.html
subprocess.check_output("eval `ssh-agent`; ssh-add <my-key-file-path>", shell=True)

我正在尝试做类似的事情,并且遇到了这篇文章,如果找到更好的解决方案,我会进行更新。