Python通过HTTP代理与pysftp连接

Python通过HTTP代理与pysftp连接,python,windows,proxy,putty,pysftp,Python,Windows,Proxy,Putty,Pysftp,目前,我正在使用Pythonsubprocess.POPEN和PuTTYpsftp.exe进行SFTP传输 它可以工作,但不太干净,也不便于运输 我希望使用Python-pysftp重现相同的行为,但我不知道在哪里输入所有参数。我在PuTTY中有以下配置: 服务器IP:123.123.123.255 服务器端口:22 连接类型:SSH 自动登录用户名:MyUser 代理类型:HTTP 代理主机名:gw.Proxy.fr 代理端口:1234 代理用户名:ProxyUser 代理密码:ProxyP

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

它可以工作,但不太干净,也不便于运输

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

  • 服务器IP:123.123.123.255
  • 服务器端口:22
  • 连接类型:SSH
  • 自动登录用户名:MyUser
  • 代理类型:HTTP
  • 代理主机名:gw.Proxy.fr
  • 代理端口:1234
  • 代理用户名:ProxyUser
  • 代理密码:ProxyPass
我应该如何在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.1\r\n\r\n".format(*target)
sock.sendall(cmd_connect)

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

我认为PySTFP不支持代理。但是请注意,PySTFP只是一个包装器,它确实支持代理

所以我建议你直接使用Paramiko

首先,请参阅,特别是


要对代理进行身份验证,在执行
CONNECT
命令后,添加
代理授权
标题,如:

代理授权:基本
其中
是base-64编码字符串
用户名:密码

auth = 'Basic ' + base64.encodebytes("username:password".encode()).decode()
args = ("123.123.123.255", 23, auth)
cmd_connect = "CONNECT {}:{} HTTP/1.1\r\nProxy-Authorization: {}\r\n\r\n".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()
如果您在docker中运行,请记住在debian中安装
ncat
。未安装netcat,它是旧版本,无法正常工作

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

天哪,它在工作。你做到了。现在,只需要处理这个键,我就在“sock.sendall(cmd_connect)”这一行中苦苦挣扎。因为它给出了TypeError:需要字节。它应该是'sock.sendall(bytes(cmd_connect),'UTF-8')。/usr/bin/nc做什么@阿齐兹·阿尔图·内特卡特。这让我接到了赛博司令部的友好电话。他们把我锁在电脑外面,扫描我的电脑,并问了很多问题。有代理的本地Python实现(从我的答案链接),那么为什么要依赖外部命令行工具呢?同样,他们也以与您类似的方式实现,但不幸的是,连接不稳定。我为我的案例分享了最佳的解决方案,你应该考虑NCAT是一个在UNIX基础上高度使用的功能。