web-dev-qa-db-fra.com

curl: (3) Caractères illégaux trouvés dans l'URL

Je veux une recherche groupée détails ip sur ipinfo.io Voici mon code. $ cat ips.txt | xargs -I% curl http://ipinfo.io/%/region

Le fichier "ips.txt" contient trois adresses IP chacune sur une ligne distincte: (1) 8.8.8.8 (2) 8.8.4.4 (3) 1.2.3.4

Cela ne résout que la dernière adresse IP. Cela devrait donner (1) la Californie (2) le Colorado (3) Washington. J'obtiens ce qui suit:

curl: (3) Caractères illégaux trouvés dans l'URL curl: (3) Caractères illégaux trouvés dans l'URL Washington

Si j'écris ips.txt avec une seule adresse IP (par exemple 8.8.8.8) j'obtiens de bons résultats. Je pense qu'il y a un problème avec mon fichier texte ou la façon dont j'utilise cat. Pouvez-vous m'aider à nettoyer mon code afin que les trois adresses IP soient résolues?

Par demande, voici les détails de ma configuration.

$ 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

Donc, pour résumer, étape par étape pour référence future,

Fonctionnement uname -A peut révéler quel système est utilisé par exemple, révélant ici que c'est Cygwin.

Cela nous amène à penser aux différences entre Windows et Linux.

L'une des différences connues concerne les fins de ligne fenêtres/dos. Cela peut être révélé, ainsi qu'en vérifiant généralement tout le contenu d'un fichier texte, avec:

cat -A ips.txt

Maintenant, si vous trouvez qu'il contient ^M les fins de ligne, comme il l'a fait ici, cela signifie que les fins de ligne sont dos/windows et non * nix les fins de ligne (qui afficheraient uniquement les lignes se terminant par $)

Pour résoudre ce problème, exécutez simplement

dos2unix ips.txt

Maintenant, si vous exécutez votre commande d'origine avec ce fichier d'entrée fixe, il semble que CURL en soit satisfait et cela fonctionne.

Merci aussi MistaGill, j'ai entendu parler de ipinfo.io de ce post.

21
clarity123

J'ai rencontré une situation similaire, et une solution rapide possible consiste à ajouter un -d "\n" drapeau à xargs:

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

Cela empêche les nouvelles lignes d'être interprétées comme faisant partie de l'argument passé à curl.

1
Tom Lord