我有这样的情况:
本地主机 --------- 跳板主机 ------- 目标机器
我正在尝试使用Paramiko在Python中编写代码,首先从本地主机到跳板主机进行SSH,然后从跳板主机到目标机器进行SSH。 从目标机器上,我想捕获一些输出,并将它们存储在本地,可以作为变量或文件(还没有到那个点)。 我在Stack Overflow上找到了一个示例,讲解如何使用Paramiko进行嵌套SSH,我按照示例进行操作,但卡在这里:
我的代码:
enter code here
#!/usr/bin/python
#
# Paramiko
#
import paramiko
import sys
import subprocess
#
# we instantiate a new object referencing paramiko's SSHClient class
#
vm=paramiko.SSHClient()
vm.set_missing_host_key_policy(paramiko.AutoAddPolicy())
vm.connect('192.168.115.103',username='osmanl',password='xxxxxx')
#
vmtransport = vm.get_transport()
dest_addr = ('192.168.115.103', 22)
local_addr = ('127.0.0.1', 22)
vmchannel = vmtransport.open_channel("direct-tcpip", dest_addr, local_addr)
#
jhost=paramiko.SSHClient()
jhost.set_missing_host_key_policy(paramiko.AutoAddPolicy())
jhost.load_host_keys('/home/osmanl/.ssh/known_hosts')
jhost.connect('10.103.53.26', username='latiu', password='xxxx', sock=vmchannel)
#
stdin, stdout, stderr = rtr.exec_command("show version | no-more")
#
print stdout.readline()
#
jhost.close()
vm.close()
# End
当我运行上述代码时,出现了以下错误:$ python sshvm.py
Traceback (most recent call last):
File "sshvm.py", line 28, in <module>
jhost.load_host_keys('/home/osmanl/.ssh/known_hosts')
File "/usr/lib/python2.7/site-packages/paramiko-1.15.2-py2.7.egg/paramiko/client.py", line 121, in load_host_keys
self._host_keys.load(filename)
File "/usr/lib/python2.7/site-packages/paramiko-1.15.2-py2.7.egg/paramiko/hostkeys.py", line 94, in load
with open(filename, 'r') as f:
IOError: [Errno 2] No such file or directory: '/home/osmanl/.ssh/known_hosts'
local_addr
应该是本地 IP 和端口。不是服务器 A 的 IP 和端口。但实际上这个值并没有真正被使用。例如,PuTTY 进行端口转发时会传递'0.0.0.0'
和0
。2)在jhost.connect
中的'10.103.53.26'
也没有被真正使用。它可能只用于主机密钥验证,但这段代码通过使用AutoAddPolicy
来明确跳过此步骤(这是错误的 - 对于正确的解决方案,请参见 Paramiko “Unknown Server”)。 - Martin Prikryl