python 3 paramiko ssh代理在第三台主机上使用远程命令转发跳转主机
Posted
技术标签:
【中文标题】python 3 paramiko ssh代理在第三台主机上使用远程命令转发跳转主机【英文标题】:python 3 paramiko ssh agent forward over jump host with remote command on third host 【发布时间】:2018-12-01 07:24:06 【问题描述】:Moin!
情况:通过 jump.host 连接到 destination.host 并在 destination.host 上运行命令,连接到another.host 的背景(在此主机上需要我的 ssh 密钥)。
方案:client --> jump.host -->destination.host --- remote_command with ssh key on the other host --> 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, hostname, ls 等等...但是如果我运行一个命令,它在后台连接到另一个需要我的 ssh 密钥的主机,错误中引发的代码:
引发 AuthenticationException("无法连接到 SSH 代理") paramiko.ssh_exception.AuthenticationException:无法连接到 SSH 代理
如果我通过 Putty 在同一条链上连接,它运行良好。
谁能给我一个提示来解决我的问题?
提前谢谢。
【问题讨论】:
【参考方案1】:假设:您的密钥可以跨跳转主机和目标主机工作。
在这种情况下创建本地代理将起作用。您可以先通过 shell 手动创建它,然后通过 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)
我正在尝试做类似的事情并遇到了这篇文章,如果我找到更好的解决方案,我会更新。
编辑:我已经在这里发布了实现 - https://adikrishnan.in/2018/10/25/agent-forwarding-with-paramiko/
【讨论】:
以上是关于python 3 paramiko ssh代理在第三台主机上使用远程命令转发跳转主机的主要内容,如果未能解决你的问题,请参考以下文章