Curl 函数无法解析来自 bash 中变量的代理

Posted

技术标签:

【中文标题】Curl 函数无法解析来自 bash 中变量的代理【英文标题】:Curl function cannot parse proxy coming from a variable in bash 【发布时间】:2020-10-06 08:28:46 【问题描述】:

我有一个代理 txt 文件,格式为:

102.129.249.120:3128
102.129.249.120:8080
101.4.136.34:8080
103.228.117.244:8080
etc

我正在尝试创建一个 bash 脚本(例如):curl -x "$IP" google.com. 不幸的是,curl 为所有代理提供了不受支持的代理语法。 有什么想法吗? 顺便说一句,我真的怀疑这个问题是否被重复了,因为我尝试了其他所有方法都无济于事。

我的脚本:

Number=$(wc -l < ProxyList.txt)



for ((i=1;i<=$Number;++i))  do
ip=$(head -n $i ProxyList.txt | tail -n +$i)
curl -p -x "$ip" 'webpage' -H 'user-agent' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Cookie: wpml_referer_url=referer; _icl_current_language=es; phpSESSID=tpikve1vl4ued06i082vprqdo1' -H 'If-Modified-Since: Mon, 16 May 2016 07:27:13 GMT' -H 'If-None-Match: "3d6-532f08d9d7640-gzip"' -H 'Cache-Control: max-age=0' -m 6
done

我的代理列表的一个小样本:

102.129.249.120:3128
102.129.249.120:8080
101.4.136.34:8080
103.228.117.244:8080
103.253.27.108:80
104.45.188.43:3128
104.250.34.179:80
105.27.238.161:80
104.154.143.77:3128
110.243.20.2:9999
111.68.26.237:8080
106.104.151.142:58198
113.252.95.19:8197
115.231.31.130:80
118.69.50.154:80
118.69.50.154:443
119.81.189.194:80
119.81.189.194:8123
119.81.199.81:8123
119.81.199.83:8123
119.81.199.80:8123
12.139.101.100:80
12.139.101.101:80
119.81.199.85:31288
119.81.199.86:8123
119.81.199.87:8123
12.139.101.102:80
124.156.98.172:443
13.228.91.252:3128
138.197.157.32:3128
138.197.157.32:8080
138.68.240.218:8080
138.68.240.218:3128
138.68.60.8:8080
138.68.60.8:3128

【问题讨论】:

@oguzismail 完成 我会使用 xargs,例如 xargs -I curl -x ... &lt;ProxyList.txt。但如果 ProxyList.txt 有 DOS 行结尾,它也会失败 你介意举个例子吗? 关于如何使用 xargs 我试过 echo $ip | xargs curl url,它仍然无法正常工作。同样的错误。 你得到什么错误?此外,您在 for 循环的 do 之前缺少一个分号。 【参考方案1】:

您的输入文件在每行末尾都有回车符。 输入文件中的每一行都以\r\n 结尾,而不仅仅是\n

您可以通过od查看:

$ head -1 ProxyList.txt | od -c
0000000   1   0   2   .   1   2   9   .   2   4   9   .   1   2   0   :
0000020   3   1   2   8  \r  \n
0000026

所以在您的脚本中,$ip 实际上的值是 102.129.249.120:3128\r

您可以使用tr 删除\r 字符,例如:

while read proxy; do
  curl -p -x $proxy $webpage
done < <( tr -d '\r' < ProxyList.txt )

【讨论】:

【参考方案2】:

试试这个:

for ip in $(cat ProxyList.txt)
do
   curl -p -x "$ip" 'webpage' -H 'user-agent' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Cookie: wpml_referer_url=referer; _icl_current_language=es; PHPSESSID=tpikve1vl4ued06i082vprqdo1' -H 'If-Modified-Since: Mon, 16 May 2016 07:27:13 GMT' -H 'If-None-Match: "3d6-532f08d9d7640-gzip"' -H 'Cache-Control: max-age=0' -m 6
done

但 curl 的问题可能是,应该像这样设置环境变量 http_proxyhttps_proxy

export http_proxy=http://1.2.3.4:3128/
export https_proxy=http://1.2.3.4:3128/

【讨论】:

同样的错误...我使用的是 ubuntu 20.04 这可能是问题吗? 'url: (5) '105.29.64.222:80 中不支持的代理语法 请试试https://***.com/questions/9445489/performing-http-requests-with-curl-using-proxy 首先设置代理环境变量,然后调用curl http://www.google.com等。 是的。仅当我输入不带变量的 ip(手动)时才有效【参考方案3】:

根据 curl 手册页,-x(或 --proxy)开关可以在参数前面加上协议前缀(如果省略,我假设它默认为 http://):-x, --proxy [protocol://]host[:port] 带有 xargs 的简单 bash 脚本如下所示:

#!/bin/bash
webpage=$1:-http://google.com
cat ProxyList.txt \
| xargs -n1 -I curl -p -x http:// "$webpage" -H 'user-agent' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Cookie: wpml_referer_url=referer; _icl_current_language=es; PHPSESSID=tpikve1vl4ued06i082vprqdo1' -H 'If-Modified-Since: Mon, 16 May 2016 07:27:13 GMT' -H 'If-None-Match: "3d6-532f08d9d7640-gzip"' -H 'Cache-Control: max-age=0' -m 6

【讨论】:

还是不行???同样的错误。你有什么版本的ubuntu?或者你有另一个发行版?我真的不知道。 'url: (5) '46.35.184.187:61003中不支持的代理语法 Debian 5.4.19 / curl 7.68.0 我从您的代理收到“curl: (56) Received HTTP code 400 from proxy after CONNECT”。这似乎与您的“-p”开关(隧道)有关。代理好像不支持?另一方面,它表明语句的“-x”部分有效。

以上是关于Curl 函数无法解析来自 bash 中变量的代理的主要内容,如果未能解决你的问题,请参考以下文章

无法解析代理:POST(在运行 curl 脚本进行 watson 文档转换时)

curl错误码大全

sh bash脚本运行循环以从文件中读取随机URL和用户代理,并使用cURL运行请求。这可以从任何系统运行

如何在带有 bash 的 CURL 请求中使用变量?

在 bash 中解析 YAML 文件中的嵌套变量

Bash:将变量插入到 curl 调用中不起作用[重复]