python - 如何在Python中使用SSH连接从远程主机发送HTTP GET请求?

标签 python http ssh paramiko ssh-tunnel

我正在使用与 Paramiko 的 SSH 连接。 我的代码:

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", '/')

最佳答案

有两个选项:

外部工具

使用 SSH 服务器上可以发送 HTTP 请求的任何可用工具。例如。 curlwget:

curl https://www.example.com/

并使用 Paramiko 执行它: Python Paramiko - Run command

此解决方案更简单,但依赖于命令 - 因此它也依赖于平台。

端口转发

将本地端口转发到远程 HTTP 服务器端口 80,并使用本地 Python 代码连接到转发的端口。

您会发现很多如何转发数据库端口的示例。像这个:Enable Python to Connect to MySQL via SSH Tunnelling

在您的情况下,您需要执行相同的操作,只是不使用数据库客户端连接到转发的端口,而是连接 HTTP 客户端(如 HTTPConnection)。

此外,在大多数情况下,当您想要进一步连接时,数据库转发通常在 SSH 服务器本身 (localhost/127.0.0.1) 上结束。

这个解决方案更复杂,但没有外部依赖 - 因此它是平台无关的。另一方面,端口转发是一种特殊权限,可能在服务器上受到限制(但通常情况下并非如此)。在尝试实现它之前,您可以使用 SSH 客户端对其进行测试。

关于python - 如何在Python中使用SSH连接从远程主机发送HTTP GET请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64017727/

相关文章:

angular - Ionic 2/Angular 与 http post 到 laravel api 的问题

python - 跨项目重用 SQLAlchemy 模型

python - 尝试读取 yaml 文件时出现错误 "found unhashable key"

python - 如何在生成的列表上使用 pytest 测试

http - HTTP get 请求的格式

http - 仅用于记录请求的简单 HTTP 服务器

github - Azure DevOps 构建子模块

ssh - scp失败,显示 “protocol error: filename does not match request”

hadoop - Mac OS 的 ssh localhost 仍然需要密码,如何处理?

python - 在 Jenkins 中部署到多个环境(DEV、UAT、PROD)