Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用sshtunnel包的两步SSH本地端口转发 我试图在HoST1和Hoest3之间打开一个双向隧道,其中中间的HES2。 host1 <--> host2 <--> host3_Python_Ssh_Paramiko_Portforwarding_Ssh Tunnel - Fatal编程技术网

Python 使用sshtunnel包的两步SSH本地端口转发 我试图在HoST1和Hoest3之间打开一个双向隧道,其中中间的HES2。 host1 <--> host2 <--> host3

Python 使用sshtunnel包的两步SSH本地端口转发 我试图在HoST1和Hoest3之间打开一个双向隧道,其中中间的HES2。 host1 <--> host2 <--> host3,python,ssh,paramiko,portforwarding,ssh-tunnel,Python,Ssh,Paramiko,Portforwarding,Ssh Tunnel,我有一个脚本在主机3上运行,正在监听端口51672。当我在主机1上创建TCP套接字并连接到主机2:51672时,我可以通过该套接字与主机3上的脚本通信 在下一步中,我将尝试将其移植到python中,并使用sshtunnel包。我有点困惑,中的哪个选项与我的场景相同 这是我的第一次尝试: import paramiko import sshtunnel with sshtunnel.open_tunnel( ssh_address_or_host=(host2, 22),

我有一个脚本在主机3上运行,正在监听端口51672。当我在主机1上创建TCP套接字并连接到主机2:51672时,我可以通过该套接字与主机3上的脚本通信

在下一步中,我将尝试将其移植到python中,并使用
sshtunnel
包。我有点困惑,中的哪个选项与我的场景相同

这是我的第一次尝试:

import paramiko
import sshtunnel

with sshtunnel.open_tunnel(
        ssh_address_or_host=(host2, 22),
        ssh_username=host2_username,
        ssh_password=host2_pass,
        local_bind_address=('0.0.0.0', 51672),
        remote_bind_address=(host3, 22),
        block_on_close=False
) as tunnel1:
    log.info('Tunnel to host2 is established.')
    with sshtunnel.open_tunnel(
            ssh_address_or_host=('localhost', tunnel1.local_bind_port),
            ssh_username=host3_username,
            ssh_password=host3_password,
            remote_bind_address=(host3, 51672),
            block_on_close=False
    ) as tunnel2:
        log.info('Tunnel to host3 is established.')
        while True:
            time.sleep(1)
我可以确认从host1到host2的隧道是打开的,因为下面的命令在host1上返回0

nc -z localhost 51672

但是,host2和host3之间的隧道似乎不起作用。

第一步是隧道SSH。然后通过隧道传输自定义端口

更容易掌握的方法(尽管不是最佳方法)是:

  • 打开到主机2的直接SSH连接
  • 通过
    host2
    连接将本地
    host1:a
    端口转发到
    host3:22
  • 使用转发端口
    host1:A
    打开到
    host3
    的SSH连接
  • 通过
    host3
    将另一个本地
    host1:B
    端口转发到
    host3:51672
  • 连接到
    host1:B
    以访问
    host3:51672
但实际上您不需要进行第一次物理端口转发,您可以使用
sock
方法,如中所示

(我认为,即使是您最初的
ssh
方法也不必要地复杂,因为它有两个转发)

nc -z localhost 51672