Que fait «echo ipv4 >> ~ / .curlrc»?

8

J'étais confronté à un problème aujourd'hui lorsque j'essayais d'installer Composer avec la commande ci-dessous:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Cela me donnait cette erreur:

curl: (7) Failed to connect to getcomposer.org port 443: Network is unreachable

J'ai googlé et trouvé cette commande :

echo ipv4 >> ~/.curlrc

J'ai couru cela et cela a résolu le problème et le compositeur s'est bien installé.

Mais je ne sais pas ce que fait la commande ci-dessus, quelqu'un pourrait-il l'expliquer?

Prashant Kumar
la source
@Melebius Lien ajouté :)
Prashant Kumar

Réponses:

9

Il s'agit d'ajouter "ipv4" au fichier "curlrc". Exemple commençant avec un fichier vide:

$ touch 1
$ more 1
$ echo ipv4 >> 1
$ more 1
ipv4

Fondamentalement, il oblige curl à utiliser ipv4.


Le manuel a ceci à dire à ce sujet:

IPv6

curl se connecte à un serveur avec IPv6 lorsqu'une recherche d'hôte renvoie une adresse IPv6 et revient à IPv4 si la connexion échoue. Les options --ipv4et --ipv6peuvent spécifier l'adresse à utiliser lorsque les deux sont disponibles. Les adresses IPv6 peuvent également être spécifiées directement dans les URL à l'aide de la syntaxe

Rinzwind
la source
J'ai exécuté cette commande uniquement, cela a fonctionné, donc je suppose que c'est correct. Juste une question, pourquoi mon compositeur ne travaillait pas en premier lieu et pourquoi cela fonctionnait après cette commande. Ce qui signifie, je pense, que curl tentait auparavant d'utiliser le réseau ipv6, qui n'est en fait pas configuré. Est-ce que c'est autre chose?
Prashant Kumar
Je suppose que c'était oui: la connexion a été refusée parce que vous l'avez obtenue de l'ipv6 attendu. Cette modification du fichier force ipv4.
Rinzwind
mais comme vous l'avez dit, curl will connect to a server with IPv6 when a host lookup returns an IPv6 address and fall back to IPv4 if the connection failspourquoi mon système vient de donner une erreur au lieu d'essayer d'accéder à ipv4 par lui-même s'il n'a pas trouvé l'ipv6.
Prashant Kumar
1
.curlrcutilise des noms d'option sans le début -ou --.
chepner
5

Une convention typique sous UNIX est que les programmes lisent (généralement) leur configuration de démarrage à partir de divers fichiers prédéfinis. Il s'agit simplement d'une tradition, rien de défini par POSIX ou toute autre norme. Un programme UNIX typique, par exemple, foobarse lirait, dans l'ordre de priorité suivant:

~/.foobarrc  ## User specific configuration parameters
/etc/foobarrc  ## Global parameters, depending on taste
               ## `/etc/foobar/*(.conf)' might be chosen too 

Il pourrait y avoir un repli /usr/share/mais ce n'est pas très courant.

Donc, curlvoici la convention et lisez sa configuration initiale ~/.curlrc. Et ce faisant echo ipv4 >>~/.curlrc, vous avez ajouté la chaîne ipv4au fichier ~/.curlrc.

La chaîne ipv4a une signification particulière pour curl- curlutilisera alors IPv4 pour la résolution de l'hôte. Ceci est analogue à l'utilisation de l'argument -4/ ipv4as à curlpartir de la ligne de commande, mais l'enregistrement dans le ~/.curlrcrend permanent.

Comme vous l'avez configuré ipv4et que tout fonctionne maintenant pour vous, vous avez probablement configuré IPv6 et curlutilisiez auparavant IPv6 pour une résolution d'hôte (réussie), donc pas de repli sur IPv4. La connexion au site a échoué car tous les sites n'ont pas leurs serveurs Web configurés pour écouter les adresses IPv6, donc l' socket()appel échouerait comme nous pouvons le voir dans ce cas.

heemayl
la source
1
Dans la pratique, cependant, /etc/foobar.confla lecture se ferait en premier lieu ~/.foobarrc, afin que cette dernière puisse l'emporter sur la première. Ainsi, si /etc/foobar.confcontient une ligne qui dit frobnitz=0et ~/.foobarrca frobnitz=1, cette dernière valeur prévaut
Monty Harder
@MontyHarder C'est exactement ce que je voulais dire par ordre de priorité ...
heemayl
Oui, l'ordre de préséance, pas l'ordre de lecture.
Monty Harder