【问题标题】:cURL (pycurl) FTP over HTTP proxycURL (pycurl) 基于 HTTP 代理的 FTP
【发布时间】:2012-02-28 06:02:17
【问题描述】:

我写了一个简单的上传脚本,然后发现下一件事: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

当我尝试从 shell 执行此操作时,响应相同:

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

为什么?我错过了什么?

【问题讨论】:

  • 您似乎正在尝试将 HTTP 与 FTP 服务器通信。您的代理是否作为具有这些设置的 FTP 代理工作,例如来自浏览器或已知的 FTP 客户端?
  • 是的。 FileZilla 通过这个代理(它是一个配置好的 squid)很好地连接(和上传)。

标签: python curl pycurl


【解决方案1】:

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/

【讨论】:

  • 目标是通过http-proxy上传。
【解决方案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 or --proxy-user &lt;proxy_user:proxy_password&gt; 如果您需要代理凭据

-u or --user &lt;ftp_user:ftp_password&gt; 如果你有远程 ftp 用户名和密码

--proxy-digest 如果您的代理使用摘要身份验证

--proxy-basic 如果您的代理使用基本身份验证

--proxy-anyauth 如果你想解除代理身份验证

-l or --list-only 如果你只想列出一个 FTP 目录。

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

--basic 使用基本身份验证的远程 ftp

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

-p or --proxytunnel 如果您有-x or --proxy,此选项将导致非 http 协议尝试通过代理进行隧道传输,而不仅仅是使用它来执行类似 http 的操作。

-v or --verbose 如果您需要详细说明

--ftp-ssl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多