Что делает «echo ipv4 >> ~ / .curlrc»?

8

Сегодня я столкнулся с некоторой проблемой при попытке установить composer с помощью следующей команды:

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

Это дало мне эту ошибку:

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

Я погуглил и нашел эту команду :

echo ipv4 >> ~/.curlrc

Я запустил это, и это решило проблему, и композитор установил просто отлично.

Но я не знаю, что делает вышеприведенная команда, кто-нибудь может это объяснить?

Прашант Кумар
источник
@Melebius Добавил ссылку :)
Прашант Кумар

Ответы:

9

Что делает, это добавляет "ipv4" в файл "curlrc". Пример, начинающийся с пустого файла:

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

В основном это заставляет curl использовать ipv4.


В руководстве есть что сказать об этом:

IPv6

curl подключится к серверу с IPv6, когда поиск узла вернет IPv6-адрес, и вернется к IPv4 в случае сбоя соединения. В --ipv4и --ipv6опции можно указать , какой адрес использовать , когда оба доступны. Адреса IPv6 также могут быть указаны непосредственно в URL с использованием синтаксиса

Rinzwind
источник
Я только что выполнил эту команду, она сработала, поэтому я думаю, что это правильно. Только один вопрос, почему мой композитор не работал в первую очередь и почему он работал после этой команды. Что, я думаю, означает, что ранее curl пытался использовать сеть ipv6, которая на самом деле не настроена. Это или что-то еще?
Прашант Кумар
Я предположил бы, что это было да: соединение отказалось, потому что вы получили его от ожидаемого ipv6. Это редактирование файла заставляет ipv4.
Rinzwind
но, как вы сказали, curl will connect to a server with IPv6 when a host lookup returns an IPv6 address and fall back to IPv4 if the connection failsпочему моя система просто выдавала ошибку, вместо этого пытаясь самостоятельно получить доступ к ipv4, если она не нашла ipv6.
Прашант Кумар
1
.curlrcиспользует имена опций без начального -или --.
chepner
5

Типичное соглашение в UNIX состоит в том, что программы (обычно) читают свою конфигурацию запуска из различных предопределенных файлов. Это просто традиция, а не что-либо определенное POSIX или любым другим стандартом. Типичная программа UNIX, например, foobarбудет читать в следующем порядке приоритета:

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

Там может быть запасной вариант, /usr/share/но это не очень распространено.

Итак, curlздесь следуем соглашению и читаем его исходную конфигурацию из ~/.curlrc. И тем самым echo ipv4 >>~/.curlrcвы добавили строку ipv4в файл ~/.curlrc.

Строка ipv4имеет особое значение для curl- curlбудет использовать IPv4 для разрешения хоста. Это аналогично использованию аргумента -4/ ipv4as curlиз командной строки, но сохранение ~/.curlrcэтого параметра делает его постоянным.

Поскольку вы установили ipv4там и теперь все работает для вас, вероятно, у вас настроен IPv6, и curlранее вы использовали IPv6 для (успешного) разрешения хоста, поэтому нет возврата к IPv4. Соединение с сайтом было неудачным, потому что не на всех сайтах настроены веб-серверы для прослушивания IPv6-адресов, поэтому socket()вызов не будет выполнен, как мы видим в этом случае.

heemayl
источник
1
На практике, однако, /etc/foobar.confсначала следует прочитать, ~/.foobarrcчтобы последний мог переопределить первый. Таким образом, если /etc/foobar.confсодержит строку, которая говорит frobnitz=0, и ~/.foobarrcимеет frobnitz=1, последнее значение преобладает
Монти Хардер
@MontyHarder Это именно то, что я имел в виду под порядком старшинства ...
Heemayl
Да, порядок старшинства, а не порядок чтения.
Монти Хардер