通过 SSH 连接到主机并使用 ssh 隧道转到另一台主机
Connect to a host via SSH and go to another with ssh tunnel
下面的代码(main.py)实现了通过SSH访问主机并为127.0.0.1访问的IP创建隧道:
import paramiko
from sshtunnel import SSHTunnelForwarder
from paramiko import SSHClient
class SSH:
def __init__(self):
self.ssh = SSHClient()
self.ssh.load_system_host_keys()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(hostname='127.0.0.1',port='10022',username='root',password='root')
def exec_cmd(self,cmd):
stdin,stdout,stderr = self.ssh.exec_command(cmd)
if stderr.channel.recv_exit_status() != 0:
print (stderr.read())
else:
print (stdout.read())
server = SSHTunnelForwarder(
'192.168.100.10',
ssh_username="root",
ssh_password="root",
remote_bind_address=('127.0.0.1', 22),
local_bind_address=('0.0.0.0', 10022)
)
server.start()
if __name__ == '__main__':
ssh = SSH()
stdin,stdout,stderr = ssh.ssh.exec_command("hostname")
retorno = stdout.read()
print (retorno)
server.stop()
我正在尝试访问一台特定的机器,为此,出于网络原因,我必须首先访问一台机器。
在 Python 中,我 运行 main.py 在初始机器上执行 SSH,然后我为另一台机器创建隧道,设法在它上面执行远程命令。
----------------------------------------------------------------------
|
-------------+ | +----------+ +---------+
HOST | | | HOST | | HOST |
MAIN.PY | -- SSH ----> | | INITIAL | -- TUNNEL --> | WANTED |
-------------+ | +----------+ +---------+
|
----------------------------------------------------------------------
Putty访问的拓扑结构是:访问初始连接(您为其创建了网络规则的那个),然后对另一台机器执行SSH命令,到达所需的机器。
如上代码所述,我只能访问第一台主机。有人可以帮助我吗?
我做了以下更改:
server = SSHTunnelForwarder(
'192.168.1.1',
ssh_username="teste2",
ssh_password="teste2",
remote_bind_address=('<Destination HOST IP>', 22),
local_bind_address=('127.0.0.1', 10022) # Here you leave the loopback ip
)
下面的代码(main.py)实现了通过SSH访问主机并为127.0.0.1访问的IP创建隧道:
import paramiko
from sshtunnel import SSHTunnelForwarder
from paramiko import SSHClient
class SSH:
def __init__(self):
self.ssh = SSHClient()
self.ssh.load_system_host_keys()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(hostname='127.0.0.1',port='10022',username='root',password='root')
def exec_cmd(self,cmd):
stdin,stdout,stderr = self.ssh.exec_command(cmd)
if stderr.channel.recv_exit_status() != 0:
print (stderr.read())
else:
print (stdout.read())
server = SSHTunnelForwarder(
'192.168.100.10',
ssh_username="root",
ssh_password="root",
remote_bind_address=('127.0.0.1', 22),
local_bind_address=('0.0.0.0', 10022)
)
server.start()
if __name__ == '__main__':
ssh = SSH()
stdin,stdout,stderr = ssh.ssh.exec_command("hostname")
retorno = stdout.read()
print (retorno)
server.stop()
我正在尝试访问一台特定的机器,为此,出于网络原因,我必须首先访问一台机器。
在 Python 中,我 运行 main.py 在初始机器上执行 SSH,然后我为另一台机器创建隧道,设法在它上面执行远程命令。
----------------------------------------------------------------------
|
-------------+ | +----------+ +---------+
HOST | | | HOST | | HOST |
MAIN.PY | -- SSH ----> | | INITIAL | -- TUNNEL --> | WANTED |
-------------+ | +----------+ +---------+
|
----------------------------------------------------------------------
Putty访问的拓扑结构是:访问初始连接(您为其创建了网络规则的那个),然后对另一台机器执行SSH命令,到达所需的机器。
如上代码所述,我只能访问第一台主机。有人可以帮助我吗?
我做了以下更改:
server = SSHTunnelForwarder(
'192.168.1.1',
ssh_username="teste2",
ssh_password="teste2",
remote_bind_address=('<Destination HOST IP>', 22),
local_bind_address=('127.0.0.1', 10022) # Here you leave the loopback ip
)