Как отправить HTTP-запрос GET с удаленного хоста, используя SSH-соединение в Python?

Я использую SSH-соединение с Paramiko. Мой код:

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=remote_host, username=remote_user, password=remote_password,
               port=remote_port)

Как отправить запрос HTTP GET с подключенного удаленного хоста (использовать его как прокси)?


Я нашел решение в соответствии с ответом:

with SSHTunnelForwarder(
        ssh_address_or_host=(remote_host, remote_port),
        ssh_username=remote_user,
        ssh_password=remote_password,
        remote_bind_address=("www.python.org", 80),
        ) as tunnel:
    conn = http.client.HTTPConnection("127.0.0.1", port=tunnel.local_bind_port)
    conn.request("GET", '/')

person Dmitry Kuznetsov    schedule 22.09.2020    source источник


Ответы (1)


Есть два варианта:

Внешний инструмент

Используйте любой инструмент, доступный на сервере SSH, который может отправлять HTTP-запрос. Например. curl или wget:

curl https://www.example.com/

И выполните его с помощью Paramiko: Python Paramiko - Run command

Это решение проще, но оно зависит от команды — так что оно также зависит от платформы.

Перенаправление порта

Перенаправьте локальный порт на порт 80 удаленного HTTP-сервера и подключитесь к переадресованному порту, используя свой локальный код Python.

Вы найдете множество примеров того, как перенаправить порт базы данных. Как этот: Включить Python для подключения к MySQL через туннелирование SSH

В вашем случае вам нужно сделать то же самое, только вместо использования клиента базы данных для подключения к переадресованному порту вы подключаете HTTP-клиент (например, HTTPConnection).

Также в большинстве случаев проброс БД обычно заканчивается на самом SSH-сервере (localhost/127.0.0.1), а вы хотите подключиться дальше.

Это решение более сложное, но без внешних зависимостей — поэтому оно не зависит от платформы. С другой стороны, перенаправление портов — это особая привилегия, которая может быть ограничена на сервере (но обычно это не так). Прежде чем пытаться реализовать его, вы можете протестировать его с помощью своего SSH-клиента.

person Martin Prikryl    schedule 23.09.2020