【发布时间】:2020-07-15 11:55:44
【问题描述】:
下面的代码(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 命令,到达所需的机器。
如上面的代码所述,我只能访问第一台主机。有人可以帮帮我吗?
【问题讨论】:
-
你没有告诉我们,你的代码有什么问题。 - 虽然我相信你的端口错了。您正在转发本地帖子 10022,但您正在连接到本地端口 22。此外,至少在您解决连接问题之前,您应该使用一致且固定的 IP 地址。所以不是
0.0.0.0,而是127.0.0.1。 -
我相信你没有理解我的问题。上面的代码不是错误,但它通过隧道仅连接到一个主机。我再说一遍,我需要在初始主机上执行访问,以便为另一台机器创建隧道并访问它。同时连接两台主机。初始 -> 第二个主机
-
在问题的最后我说,“如上代码所述,我只能访问第一台主机。”我需要帮助来创建可以同时访问两个主机的代码
-
我明白你想做什么(虽然我可能不明白你的问题)。
server.start()连接到第一台服务器,然后SSH尝试连接到第二台服务器。但它反而连接到 127.0.0.1:22。如果这没有引发任何错误(因为您似乎表明您没有得到任何错误),那只是因为有一个本地 SSH 服务器并且代码错误地连接到它。 -
为了让我访问两台服务器,我需要通知 2 个 ip。最初我通知一个 IP 并连接,之后我需要通知我的第二个 IP(我想建立隧道)然后我使用 SSH 使用 127.0.0.1 访问隧道。两台主机 IP1 和 IP2 访问 IP1 后我创建隧道通知 IP2 并通过 127.0.0.1 访问 IP2
标签: python networking ssh paramiko tunnel