cURL (pycurl) 通过HTTP代理进行FTP

3 投票
2 回答
14463 浏览
提问于 2025-04-17 12:27

我在写一个简单的上传脚本,结果遇到了一个问题:curl尝试在一个ftp服务器上执行PUT操作。

这是简化后的代码:

import pycurl
from os.path import getsize

c = pycurl.Curl()
c.setopt(pycurl.URL, 'ftp://<ftp_name>:21/asus.c')
c.setopt(pycurl.USERPWD, 'username:password')
c.setopt(pycurl.PROXY, '10.0.0.35')
c.setopt(pycurl.PROXYPORT, 3128)
c.setopt(pycurl.VERBOSE, 1)
f = open('asus.c')
c.setopt(pycurl.INFILE, f)
c.setopt(pycurl.INFILESIZE, getsize('asus.c'))
c.setopt(pycurl.HTTPPROXYTUNNEL, 1)
c.setopt(pycurl.UPLOAD, 1)
c.perform()

几个月前,几乎相同的代码运行得很好,但现在却不行了:

* About to connect() to proxy <IP> port 3128 (#0)
*   Trying <IP>... * connected
* Connected to <IP> (<IP>) port 3128 (#0)
* Establish HTTP proxy tunnel to <ftp_name>:21
* Server auth using Basic with user 'username'
> CONNECT <ftp_name>:21 HTTP/1.1
Host: <ftp_name>:21
User-Agent: PycURL/7.21.6
Proxy-Connection: Keep-Alive

< HTTP/1.0 200 Connection established
< 
* Proxy replied OK to CONNECT request
* Server auth using Basic with user 'username'
> PUT /asus.c HTTP/1.1
Authorization: Basic _______________________________
User-Agent: PycURL/7.21.6
Host: <ftp_name>:21
Accept: */*
Content-Length: 2627
Expect: 100-continue

220 ProFTPD 1.3.3 Server (______ FTP Server) [<IP>]
500 PUT not understood
500 AUTHORIZATION: not understood
500 USER-AGENT: not understood
500 HOST: not understood
500 ACCEPT: not understood
500 CONTENT-LENGTH: not understood
500 EXPECT: not understood
500 Invalid command: try being more creative

而当我在命令行中尝试这样做时,得到的回应也是一样:

curl --upload-file "asus.c" --proxy 10.0.0.35:3128 \
--proxytunnel -u username:password ftp://<ftp_name>/asus.c

这是为什么呢?我漏掉了什么吗?

2 个回答

0

ftp上传的语法是:

curl -u "Remote-FTP-Username@remote.ftp.server Proxy-Username:Remote-Pass"     --ftp-account Proxy-Password --upload-file local-file     ftp://my-ftp.proxy.server:21/remote/upload/path/
2

这是我用的格式。

curl --user 'ftp_user:ftp_password' --disable-epsv --proxytunnel -x 'yourproxy.com:port' -T 'your.localfile' 'ftp://remote.ftp.org:port/path' -v

我花了很多时间在这些参数上挣扎,如果你在用curl时遇到ftp问题,告诉我一声。

这里有一些相关的参数:

-U 或 --proxy-user <proxy_user:proxy_password> 如果你需要代理的用户名和密码

-u 或 --user <ftp_user:ftp_password> 如果你有远程ftp的用户名和密码

--proxy-digest 如果你的代理使用的是摘要认证

--proxy-basic 如果你的代理使用的是基本认证

--proxy-anyauth 如果你想让程序自动检测代理的认证方式

-l 或 --list-only 如果你只想列出一个FTP目录的内容。

--digest 远程ftp使用摘要认证

--basic 远程ftp使用基本认证

-3 或 --sslv3 (SSL) 强制curl在连接远程ssl服务器时使用SSL版本3

-p 或 --proxytunnel 如果你使用了-x 或 --proxy,这个选项会让非http协议尝试通过代理进行隧道连接,而不是仅仅用它来进行类似http的操作。

-v 或 --verbose 如果你需要详细输出

--ftp-ssl

撰写回答