web-dev-qa-db-ja.com

curl:(3)URLで不正な文字が見つかりました

一括検索したい ip詳細はipinfo.ioで これが私のコードです。 $ cat ips.txt | xargs -I% curl http://ipinfo.io/%/region

ファイル「ips.txt」には、3つの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で不正な文字が見つかりましたWashington

Ips.txtに1つのIPアドレスのみ(たとえば8.8.8.8)を書き込むと、良い結果が得られます。テキストファイルまたは猫の使い方に問題があると思います。 3つすべての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
10
MistaGill

要約すると、将来の参照のための段階的なステップとして、

uname -Aを実行すると、使用されているシステムが明らかになります。たとえば、ここではCygwinであることを明らかにしています。

これにより、WindowsとLinuxの違いについて考えるようになります。

既知の違いの1つは、windows/dosの行末です。これは、テキストファイルのすべての内容を一般的にチェックするだけでなく、次のようにして明らかにすることができます。

cat -A ips.txt

ここで^Mの行末が含まれていることがわかった場合、これは行末がdos/windowsであり、* nixの行末ではないことを意味します($で終わる行のみが表示されます)

これを修正するには、単に実行します

dos2unix ips.txt

さて、この固定入力ファイルを使用して元のコマンドを実行すると、CURLはそれで満足しているようで、機能します。

MistaGillにも感謝します。この投稿からipinfo.ioについて学びました。

21
clarity123

私は同じような状況に遭遇しました、そして可能な迅速な修正はxargs-d "\n"フラグを追加することです:

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

これにより、改行がcurlに渡される引数の一部として解釈されなくなります。

1
Tom Lord