【问题标题】:Double SSH tunnel within PythonPython中的双SSH隧道
【发布时间】:2019-07-15 11:26:16
【问题描述】:

今天我在命令行中使用 ssh 从远程服务器转发端口,使用中间服务器到我的本地机器。

这是我在 shell 中使用的命令:

ssh user@remote_server -L 2443:localhost:433

此 ssh 会话使用 ssh 配置文件发出多跳:

Host intermediate_server
   IdentityFile "google_compute_engine"

Host remote_server
   ProxyCommand ssh user@intermediate_server -W %h:%p

ssh 命令需要为中间服务器(使用计算引擎密钥)和远程服务器(不同的密码)输入密码 输入密码后,此代码有效:

import requests
import pandas as pd
from requests.auth import HTTPBasicAuth

url = 'https://localhost:2443/my_site'
my_ds = requests.get(url, auth=HTTPBasicAuth('user', 'password'), verify=False)
print pd.read_json(my_ds.content)

但是,我只能在命令行中使用手动 ssh 隧道让它工作。

如何在 python 中使用密钥、用户名和密码启动双隧道? 我尝试使用 sshtunnel 包,但它只能帮助我进行一个端口转发而不是双重。

【问题讨论】:

    标签: python ssh paramiko ssh-tunnel


    【解决方案1】:

    你可以试试这个例子:https://github.com/pahaz/sshtunnel#example-4

    import sshtunnel
    import requests
    import pandas as pd
    from requests.auth import HTTPBasicAuth
    
    with sshtunnel.open_tunnel(
        ssh_address_or_host=('remote_server', 22),
        ssh_username="user",
        remote_bind_address=('intermediate_server', 22),
        block_on_close=False
    ) as tunnel1:
        print('Connection to tunnel1 (intermediate_server) OK...')
        with sshtunnel.open_tunnel(
            ssh_address_or_host=('127.0.0.1', tunnel1.local_bind_port),
            remote_bind_address=('127.0.0.1', 2443),
            ssh_username='user',
            ssh_password='intermediate_server_pwd',
            block_on_close=False
        ) as tunnel2:
            url = 'https://localhost:'+tunnel2.local_bind_port+'/my_site'
            my_ds = requests.get(url, auth=HTTPBasicAuth('user', 'password'), verify=False)
            print(my_ds.content)
    

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 2019-01-12
      • 2019-08-07
      • 1970-01-01
      • 2023-02-14
      • 2020-09-14
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多