Python Connect over HTTP proxy with pysftp



目前,我正在使用Python subprocess.POPEN和PuTTY psftp.exe进行SFTP传输。

它正在工作,但不是真正干净,也不可运输。

我想使用 Python pysftp 重现相同的行为,但我不知道在哪里输入所有参数。我在 PuTTY 中有以下配置:

  • 服务器IP : 123.123.123.255
  • 服务器端口 : 22
  • 连接类型 : SSH
  • 自动登录用户名 : 我的用户
  • 代理类型 : HTTP
  • 代理主机名 : gw.proxy.fr
  • 代理端口 : 1234
  • 代理用户名 : 代理用户
  • 代理
  • 密码:代理通行证

我应该如何在pysftp中输入所有这些参数,以便我可以检索我的文件?

编辑:利用Martin Prikryl的答案,我发现了一些可以探索的新东西。如果我理解得很好,我需要使用插座。把我仍然有一些问题来输入我需要的所有信息。

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
proxy = ("gw.proxy.fr",1234)
sock.connect(proxy)
target=("123.123.123.255",23)
cmd_connect = "CONNECT {}:{} HTTP/1.1rnrn".format(*target)
sock.sendall(cmd_connect)

我从中收到的响应是 HTTP/1.0 407 Proxy Authentication Required ,这很正常,因为我没有在任何地方使用代理身份验证信息。那么,您知道如何使用它们并将它们输入我的套接字吗?

我不认为pysftp支持代理。但请注意,pysftp 只是 Paramiko 库的包装器,它确实支持代理。

所以我建议你直接使用帕拉米科。

首先,请参阅如何在Python Paramiko中通过HTTP代理ssh?,特别是@tintin的答案。

<小时 />

若要向代理进行身份验证,请在 CONNECT 命令后添加Proxy-Authorization标头,如下所示:

Proxy-Authorization: Basic <credentials>

其中<credentials>是 base-64 编码的字符串username:password

auth = 'Basic ' + base64.encodebytes("username:password".encode()).decode()
args = ("123.123.123.255", 23, auth)
cmd_connect = "CONNECT {}:{} HTTP/1.1rnProxy-Authorization: {}rnrn".format(*args)

就我而言,我这样做:

import pysftp
import paramiko
hostname, prot = 'some.host.name', 22
proxy = paramiko.proxy.ProxyCommand('/usr/bin/nc --proxy proxy.foobar:8080 %s %d' % (hostname, port))
t = paramiko.Transport(sock=proxy)
t.connect(username='abc', password='123')
sftp = paramiko.SFTPClient.from_transport(t) # back to pysftp wrapper
sftp.listdir('.')

试试这个:

import paramiko
use_proxy = True
# PROXY
host_proxy = ''
port_proxy = ''
# SFTP
host = ''
port = 22
username = ''
password = ''
try:
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    if host_proxy and use_proxy:
    # find the path to nc on the command line: "which nc"
        proxy = paramiko.ProxyCommand(f"/bin/nc --proxy {host_proxy}:{port_proxy} {host} {port}") 
        trans = paramiko.Transport(proxy)
    else:
        trans = paramiko.Transport((host, port))
    trans.connect(username=username, password=password)
    sftp = paramiko.SFTPClient.from_transport(trans)
except Exception as e:
    print(e)

sftp.listdir('.')
sftp.close()
trans.close()

请记住安装 ncat 如果你在 docker 中运行,在 debian 中。不安装netcat,它是旧版本,不能很好地工作。

apt-get -y update && apt-get -y install ncat

最新更新