我需要通过jumphost ssh到远程机器。
使用ssh我喜欢这样: ssh -A -t user @ jumphost ssh -A user @ vm_to_login
如果我只是想运行一些命令,我运行: ssh -A -t user @ jumphost ssh -A user @ vm_to_login"命令执行"
现在我尝试使用python执行此操作:
def ssh_connect(jumphost_ip):
ssh_client=paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
path_to_key=os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
ssh_client.connect(jumphost_ip, username='vagrant', key_filename=path_to_key, allow_agent=True)
return ssh_client
ssh_client = ssh_connect(host_ip)
stdin, stdout, stderr = ssh_client.exec_command( """ssh montana@vm_to_run_command -A "docker network inspect --format '{{json .Containers }}' bridge" """, get_pty=True)
当我运行上面的脚本时,程序挂起无限时间..我只是猜测SSHClient对象无法向ssh代理添加密钥,当第二个服务器查找密钥时,密钥请求转到跳转框和从跳转到一些我的本地,但SSHClient对象确实有这些键。
如果需要更多信息,请告诉我。
答案 0 :(得分:1)
我已经得到了如何使用paramiko
处理代理转发的答案def ssh_connect(jumphost_ip):
ssh_client=paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
path_to_key=os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
ssh_client.connect(jumphost_ip, username='vagrant', key_filename=path_to_key, allow_agent=True)
s = ssh_client.get_transport().open_session()
# set up the agent request handler to handle agent requests from the server
paramiko.agent.AgentRequestHandler(s)
return ssh_client
在使用上述程序之前,用户必须确保将正确的私钥添加到ssh-agent。在主机上运行命令以将私钥添加到ssh-agent: 1. eval $(ssh-agent) 2. ssh-add [私钥的路径。 ex - 〜/ .ssh / id_rsa]