curl:(3)在URL中发现非法字符
我想批量查找这里是我的代码。curl:(3)在URL中发现非法字符,curl,cat,ip-geolocation,Curl,Cat,Ip Geolocation,我想批量查找这里是我的代码。 $cat ips.txt | xargs-I%curlhttp://ipinfo.io/%/region 文件“ips.txt”包含三个ip地址,每个地址位于单独的一行: (1) 8.8.8.8 (2) 8.8.4.4 (3) 1.2.3.4 这只解析最后一个ip地址。它应该给(1)加利福尼亚(2)科罗拉多(3)华盛顿。我得到以下信息: curl:(3)在URL中发现非法字符 curl:(3)在URL中发现非法字符 华盛顿 如果我只使用一个ip地址(例如8.8.8.
$cat ips.txt | xargs-I%curlhttp://ipinfo.io/%/region
文件“ips.txt”包含三个ip地址,每个地址位于单独的一行:
(1) 8.8.8.8
(2) 8.8.4.4
(3) 1.2.3.4
这只解析最后一个ip地址。它应该给(1)加利福尼亚(2)科罗拉多(3)华盛顿。我得到以下信息:
curl:(3)在URL中发现非法字符
curl:(3)在URL中发现非法字符
华盛顿
如果我只使用一个ip地址(例如8.8.8.8)编写ips.txt,我会得到很好的结果。我认为我的文本文件或我使用cat的方式有问题。你能帮我清理代码,这样三个ip地址都能解析吗
根据请求,以下是我的设置详细信息
$ uname -a
CYGWIN_NT-10.0 OFFICECOMP 2.3.1(0.291/5/3) 2015-11-14 12:44 x86_64 Cygwin
$ curl -V
curl 7.45.0 (x86_64-unknown-cygwin) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 lib idn/1.29 libssh2/1.5.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: Debug IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets Metali
因此,总结一下,作为今后参考的一步 运行
uname-A
可以显示正在使用的系统,例如,这里显示的是Cygwin
这让我们想到Windows和Linux的区别
已知的区别之一是windows/dos行的结尾。这一点可以通过以下方式显示出来,通常也可以通过检查文本文件的所有内容来显示:
cat -A ips.txt
现在,如果您发现它包含^M
行结束符,就像这里一样,这意味着行结束符是dos/windows,而不是*nix行结束符(这将只显示以$
结尾的行)
要解决此问题,只需运行
dos2unix ips.txt
现在,如果您使用这个固定的输入文件运行您的原始命令,那么CURL似乎对它很满意,并且可以正常工作
同样感谢您,MistaGill,我从这篇文章中了解了
ipinfo.io
。我遇到了类似的情况,一个可能的快速解决方法是在xargs
中添加一个-d“\n”
标志:
cat ips.txt | xargs -d "\n" -I% curl http://ipinfo.io/%/region
这可以防止新行被解释为传递给
curl
的参数的一部分,而不知道ips.txt的内容,我们做不了多少。您可以做的是用一个脚本替换curl调用,该脚本执行echo“tryingurl'$1'”;卷曲“$1”
-这将允许您查看哪一个失败。ips.txt只是三个ip地址的三行8.8.8.8.8.8.8.4.4 1.2.3.4如果我删除任意两个ip地址并只保留一个,则curl工作正常,我会得到结果。检查txt文件的字符编码,然后检查PHP的字符编码假设剧本两者都应该定义,而不是假设信息的链接。可能不是Cygwin的问题,因为只处理文本,这应该是通用的,不包括任何编码问题,但从我可以看出,这不是一个编码错误,它是在抱怨你传递的整个URLWashington
。但我没有在输入中看到华盛顿。那你怎么办,更新问题,把它包括进去。把行尾改成LF对我来说很有效(我用了升华文本)谢谢!我有一个URL的文本文件,对其进行了URI编码,但\r字符也进行了编码。删掉它使我的脚本运行良好。此外,如果您在windows共享驱动器上运行dos2unix,它将失败。因此,将文本文件移动到本地linux并运行该命令。