【问题标题】:performing HTTP requests with cURL (using PROXY)使用 cURL 执行 HTTP 请求(使用 PROXY)
【发布时间】:2012-03-15 18:33:22
【问题描述】:

我有这个代理地址:125.119.175.48:8909

如何使用 cURL(如 curl http://www.example.com)执行 HTTP 请求,但指定我的网络的代理地址?

【问题讨论】:

    标签: linux curl proxy


    【解决方案1】:

    来自man curl

    -x, --proxy <[protocol://][user:password@]proxyhost[:port]>
    
         Use the specified HTTP proxy. 
         If the port number is not specified, it is assumed at port 1080.
    

    【讨论】:

    • curl: (7) 无法连接到主机 curl: (7) 无法连接到主机
    • 运行此命令时出现上述错误: curl -x, --proxy 122.72.2.200:80 mysite.com/test.php?id=1
    • "-x, --proxy" 表示可以使用任何一个。命令应该是“curl -x 122.72.2.200:80 mysite.com/test.php?id=1”或“curl --proxy 122.72.2.200:80 mysite.com/test.php?id=1
    • 文档如上正确引用,但是用户和密码的表达方式应该不同:-x user:password@proxyhost:port
    • 如果您需要 curl 并通过代理获取,请执行 curl -x GET mysite.com --proxy yourproxy:port
    【解决方案2】:

    一般方式:

    export http_proxy=http://your.proxy.server:port/
    

    然后您可以通过(许多)应用程序的代理进行连接。

    并且,根据下面的评论,对于 https:

    export https_proxy=https://your.proxy.server:port/
    

    【讨论】:

    • 当需要代理HTTPS流量时,环境变量为大写:HTTPS_PROXY
    • 来自man pages 环境变量可以指定为小写或大写。小写版本优先。 http_proxy 是一个例外,因为它只能以小写形式使用。使用环境变量设置代理与使用 --proxy 选项的效果相同。
    • @BipinVayalu,你想检查什么?这样,我上面描述的,客户端使用代理“直接方式”,不是透明的。因此,代理会给出标准的 HTTP 答案(包括 HTTP 代码)。如果您导出错误的 http_proxy 环境变量(例如错误端口...),客户端将无法连接到该变量,并给出错误消息:“警告!无法连接到远程主机!”,或类似的东西- 试试吧:)
    • 如果你检查 curl 源代码,你会在 url.c(版本 7.39 中的第 4337 行)看到他们检查小写版本,如果找不到,检查大写。跨度>
    • 大多数用户给我发了一个更正,现在我分享一下。如果你想通过代理使用 HTTPS 连接,那么你应该这样做: export https_proxy=your.proxy.server:port 注意,URL schema 中有“http”proto,而不是 httpS!
    【解决方案3】:

    上述解决方案可能不适用于我自己尝试的某些 curl 版本(curl 7.22.0)。但对我有用的是:

    curl -x http://proxy_server:proxy_port --proxy-user username:password -L http://url
    

    希望它能更好地解决问题!

    【讨论】:

    • 遇到同样的问题,Debian Wheezy 自带的 curl 仍然不支持 env 技巧
    • 得到了这个而不是[1] 4812
    【解决方案4】:

    请注意,如果您使用的是 SOCKS 代理,而不是 HTTP/HTTPS 代理,则需要使用 --socks5 开关:

    curl --socks5 125.119.175.48:8909 http://example.com/
    

    您也可以使用--socks5-hostname 代替--socks5 在代理端解析DNS。

    【讨论】:

    • 这对我不起作用,但使用 --socks5-hostname 可以。
    • @MichałRybak 的工作方式相同,但在代理端解析 DNS。有关详细信息,请参阅man page
    • curl https://api.ipify.org --proxy socks5://189.100.246.182:37339 似乎对我来说很好用。使用 socks5 代理时,--proxy 选项在某种程度上是否不如 --socks5
    • @user993683 这取决于版本。 --proxy 现在可能是您想要的,但并不总是得到支持。另请注意,socks5://socks5h:// 分别在连接到代理之前和之后执行主机名 (DNS) 解析。
    【解决方案5】:

    作为对 airween 的补充,另一个好主意是将其添加到您的 .bashrc 中,这样您就可以从非代理环境切换到代理环境:

    alias proxyon="export http_proxy='http://YOURPROXY:YOURPORT';export https_proxy='http://YOURPROXY:YOURPORT'"
    alias proxyoff="export http_proxy='';export https_proxy=''"
    

    WHERE YOURPROXY:YOURPORT 就是你的 ip 和端口代理 :-)。

    然后,简单地做

    proxyon
    

    您的系统将开始使用代理,而恰恰相反:

    proxyoff
    

    【讨论】:

    • unset http_prox ;) !
    【解决方案6】:

    使用下面的

    curl -I -x 192.168.X.X:XX http://google.com

    192.168.X.X:XX输入你的代理服务器ip和端口。

    -v 详细模式它将提供更多详细信息,包括标头和响应。

    【讨论】:

    • 这应该是答案。不是每个人都想为主机上每个 HTTP 客户端执行的每个 HTTP 请求指定一个全局变量(导出)。这个选项提供了更大的灵活性,恕我直言。
    • 当您针对一个 url 尝试不同的代理时,这非常有用。谢谢。
    【解决方案7】:

    我喜欢使用它来获取我所在的 IP

    curl -x http://proxy_server:proxy_port https://api.ipify.org?format=json && echo
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案8】:

      对于curl,您可以通过添加proxy 值在~/.curlrc(Windows 上为_curlrc)文件中配置代理,语法为:

      proxy = http://username:password@proxy-host:port
      

      【讨论】:

      • 就是这样!几年前在该文​​件中配置了代理设置,今天想知道为什么 curl 不再工作了,现在代理地址已更改并且 env vars 都设置正确。谢谢!
      • 在 Windows 上,“_curlrc”文件可以(必须?)放在“%APPDATA%”目录中。
      【解决方案9】:

      curl -I "https://www.google.com" -x 1.1.1.1:8080

      【讨论】:

      • 考虑为您的解决方案添加解释。
      【解决方案10】:

      只是总结所有提到的好答案:

      curl -x http://<user>:<pass>@<proxyhost>:<port>/ -o <filename> -L <link>
      

      【讨论】:

        【解决方案11】:

        我使用带有身份验证的代理:

        curl -x <protocol>://<user>:<password>@<host>:<port> --proxy-anyauth <url>
        

        因为,我不知道为什么 curl 不使用/捕获 http[s]_proxy 环境变量。

        【讨论】:

          【解决方案12】:

          如果您只是为一次性命令设置代理,则不需要导出 http[s]_proxy shell 变量。例如

          http_proxy=http://your.proxy.server:port curl http://www.example.com
          

          也就是说,如果我知道我总是要使用代理,我会更喜欢 curl -x

          【讨论】:

            【解决方案13】:
            sudo curl -x http://10.1.1.50:8080/ -fsSL https://download.docker.com/linux/ubuntu/gpg
            

            这对我来说非常有效,错误是因为 curl 需要设置 代理

            记住用你的代理替换代理,我的,“示例”是 http://10.1.1.50:8080/.

            【讨论】:

              【解决方案14】:

              curl -vv -ksL "https://example.com" -x "http://&lt;proxy&gt;:&lt;port&gt;"

              【讨论】:

                【解决方案15】:

                根据您的工作场所,您可能还需要为 curl 指定 -k--insecure 选项,以便解决 CA 证书的潜在问题。

                curl -x <myCompanyProxy>:<port> -k -O -L <link to file to download>
                

                【讨论】:

                  【解决方案16】:

                  如果代理使用带有 PAC 文件的自动代理。我们可以从 PAC URL 的 javascript 中找到实际的代理。

                  如果代理需要身份验证,我们可以先使用普通的网络浏览器访问将促进身份验证对话框的网站。鉴权后,我们可以使用wireshark捕获发送给代理服务器的http包,从http包中,我们可以从http头获取auth token:Proxy-Authorization

                  然后我们可以设置 http_proxy 环境变量,并在 http 标头中包含身份验证令牌:Proxy-Authorization

                  导出 http_proxy=http://proxyserver:port

                  curl -H "代理授权: xxxx" http://targetURL

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-11-16
                    • 2012-11-26
                    • 2011-08-30
                    • 2013-04-29
                    • 1970-01-01
                    • 2020-02-29
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多