【问题标题】:curl: (3) Illegal characters found in URLcurl: (3) URL中发现非法字符
【发布时间】:2016-02-19 12:48:03
【问题描述】:

我想批量查找ip details at ipinfo.io 这是我的代码。 $ cat ips.txt | xargs -I% curl http://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

【问题讨论】:

  • 在不知道 ips.txt 的内容的情况下,我们无能为力。您可以做的是将 curl 调用替换为执行 echo "Trying url '$1'"; curl "$1" 的脚本 - 这将允许您查看哪个失败。
  • ips.txt 就是三个单行的三个ip地址 8.8.8.8 8.8.4.4 1.2.3.4
  • 如果我消除任何两个 IP 地址并只保留一个,那么 curl 工作正常,我得到结果。
  • 检查TXT文件的字符编码,然后检查PHP脚本的字符编码假设。两者都应该被定义而不是假设
  • 感谢您的信息。可能不是 Cygwin 问题,因为只处理文本,这应该是通用的,除非有任何编码问题,但据我所知,它不是编码错误,它抱怨你传递给它的整个 URL Washington。但我在输入中没有看到Washington。怎么办cat -A ips.txt 并更新问题以包含此内容。

标签: curl cat ip-geolocation


【解决方案1】:

我遇到了类似的情况,一个可能的快速解决方法是在xargs 中添加一个-d "\n" 标志:

cat ips.txt | xargs -d "\n" -I% curl http://ipinfo.io/%/region

这可以防止新行被解释为传递给curl的参数的一部分。

【讨论】:

    【解决方案2】:

    所以总结一下,作为以后参考的一步一步,

    运行 uname -A 可以显示正在使用的系统,例如这里显示的是 Cygwin。

    这让我们开始思考 Windows 与 Linux 的差异。

    已知的区别之一是 windows/dos 行结尾。这可以通过以下方式显示,以及通常检查文本文件的所有内容:

    cat -A ips.txt
    

    现在,如果您发现它包含 ^M 行尾,就像这里所做的那样,这意味着行尾是 dos/windows 而不是 *nix 行尾(只会显示以 $ 结尾的行)

    要解决这个问题,只需运行

    dos2unix ips.txt
    

    现在,如果您使用这个固定的输入文件运行您的原始命令,CURL 似乎对此很满意并且可以正常工作。

    也感谢 MistaGill,我从这篇文章中了解到 ipinfo.io

    【讨论】:

    • 将行尾更改为 LF 对我有用(我使用了 Sublime Text)
    • 谢谢!我有一个 URI 编码的 URL 文本文件,但 \r 字符也被编码。修剪它使我的脚本运行良好。
    • 另外,如果您在 Windows 共享驱动器上运行 dos2unix,它将失败。因此,将文本文件移动到本地 linux 并运行命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2018-04-07
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多