Python 使用 pysftp 通过 HTTP 代理连接
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
- 代理用户名: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 Proxy Authentication Required
,这很正常,因为我没有在任何地方使用 Proxy 身份验证信息。那么,您知道我如何使用它们并将它们输入到我的套接字中吗?
我认为 pysftp 不支持代理。尽管请注意 pysftp 只是 Paramiko library 的包装器,它确实支持代理。
所以我建议你直接使用Paramiko。
首先请参阅 How to ssh over HTTP proxy in Python Paramiko?, particularly the answer by @tintin。
要向代理进行身份验证,请在 CONNECT
命令后添加一个 Proxy-Authorization
header,例如:
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.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
目前,我正在使用 Python subprocess.POPEN
和 PuTTY psftp.exe
.
它在工作,但不是很干净,也不能移动。
我想使用 Python pysftp 重现相同的行为,但我不知道在哪里输入所有参数。我在 PuTTY 中有以下配置:
- 服务器IP:123.123.123.255
- 服务器端口:22
- 连接类型:SSH
- 自动登录用户名:我的用户
- 代理类型: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 Proxy Authentication Required
,这很正常,因为我没有在任何地方使用 Proxy 身份验证信息。那么,您知道我如何使用它们并将它们输入到我的套接字中吗?
我认为 pysftp 不支持代理。尽管请注意 pysftp 只是 Paramiko library 的包装器,它确实支持代理。
所以我建议你直接使用Paramiko。
首先请参阅 How to ssh over HTTP proxy in Python Paramiko?, particularly the answer by @tintin。
要向代理进行身份验证,请在 CONNECT
命令后添加一个 Proxy-Authorization
header,例如:
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.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