私はこのシナリオを持っています:
ローカルホスト---------ジャンプホスト-------ターゲットマシン
Python Paramikoを使用して、最初にローカルホストからジャンプホストにSSHで接続し、次にジャンプホストからターゲットマシンにSSHで接続するコードを記述しようとしています。ターゲットマシンから、いくつかの出力をキャプチャして、変数またはファイルとしてローカルに保存したい(まだその時点には到達していません)。スタックオーバーフローから、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'
次の編集されたコードを試してください。動作するはずです。
#!/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 = ('10.103.53.26', 22) #edited#
local_addr = ('192.168.115.103', 22) #edited#
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') #disabled#
jhost.connect('10.103.53.26', username='latiu', password='xxxx', sock=vmchannel)
#
stdin, stdout, stderr = jhost.exec_command("show version | no-more") #edited#
#
print stdout.read() #edited#
#
jhost.close()
vm.close()
# End
OPが特にParamiko
を要求したことは知っていますが、これはfabric
を使用すると非常に簡単に実行できます。これが私の解決策です
from fabric import Connection
out = Connection('Host1').run('Host2 uptime')
print(out.stdout.strip())
これは私にとっては問題なく機能し、出力も変数に格納されています。