Apa yang dilakukan “echo ipv4 >> ~ / .curlrc”?

8

Saya menghadapi beberapa masalah hari ini ketika mencoba menginstal komposer dengan perintah di bawah ini:

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

Itu memberi saya kesalahan ini:

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

Saya mencari di Google dan menemukan perintah ini :

echo ipv4 >> ~/.curlrc

Saya menjalankan ini dan itu memperbaiki masalah dan komposer diinstal dengan baik.

Tapi saya tidak tahu apa yang dilakukan perintah di atas, adakah yang bisa menjelaskannya?

Prashant Kumar
sumber
@Melebius Link tambahan :)
Prashant Kumar

Jawaban:

9

Apa yang dilakukan adalah menambahkan "ipv4" ke file "curlrc". Contoh dimulai dengan file kosong:

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

Pada dasarnya itu memaksa curl untuk menggunakan ipv4.


The pengguna telah mengatakan tentang hal itu:

IPv6

curl akan terhubung ke server dengan IPv6 ketika pencarian host mengembalikan alamat IPv6 dan kembali ke IPv4 jika koneksi gagal. The --ipv4dan --ipv6pilihan dapat menentukan alamat untuk digunakan saat keduanya tersedia. Alamat IPv6 juga dapat ditentukan secara langsung dalam URL menggunakan sintaks

Rinzwind
sumber
Saya menjalankan perintah itu saja, itu berhasil jadi saya kira itu benar. Hanya satu pertanyaan, mengapa komposer saya tidak bekerja di tempat pertama dan mengapa itu berhasil setelah perintah ini. Yang menurut saya berarti, curl sebelumnya mencoba menggunakan jaringan ipv6, yang sebenarnya tidak dikonfigurasi. Apakah itu atau sesuatu yang lain?
Prashant Kumar
Saya akan menganggap itu ya: koneksi ditolak karena Anda mendapatkannya dari ipv6 yang diharapkan. Edit file ini memaksa ipv4.
Rinzwind
tetapi seperti yang Anda katakan curl will connect to a server with IPv6 when a host lookup returns an IPv6 address and fall back to IPv4 if the connection failsmengapa sistem saya hanya memberikan kesalahan alih-alih mencoba mengakses ipv4 dengan sendirinya jika tidak menemukan ipv6.
Prashant Kumar
1
.curlrcmenggunakan nama opsi tanpa yang memimpin -atau --.
chepner
5

Konvensi khas UNIX adalah bahwa program (biasanya) membaca konfigurasi startup mereka dari berbagai file yang telah ditentukan. Ini hanyalah sebuah tradisi, bukan apa pun yang didefinisikan oleh POSIX atau standar lainnya. Contoh program UNIX misalnya foobarakan membaca, dengan urutan prioritas sebagai berikut:

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

Mungkin ada mundur /usr/share/tetapi itu tidak terlalu umum.

Jadi, di curlsini mengikuti konvensi dan membacanya dari konfigurasi awal ~/.curlrc. Dan dengan melakukan echo ipv4 >>~/.curlrc, Anda telah menambahkan string ipv4ke file ~/.curlrc.

String ipv4memiliki arti khusus untuk curl- curlakan menggunakan IPv4 untuk resolusi host. Ini analog dengan menggunakan argumen -4/ ipv4as curldari baris perintah, tetapi menyimpan untuk ~/.curlrcmenjadikan ini permanen.

Seperti yang telah Anda atur ipv4di sana dan sekarang semuanya berfungsi untuk Anda, mungkin Anda telah mengkonfigurasi IPv6, dan curlsebelumnya menggunakan IPv6 untuk resolusi host (berhasil), jadi tidak ada cadangan untuk IPv4. Sambungan ke situs gagal karena tidak semua situs memiliki server web yang dikonfigurasikan untuk mendengarkan alamat IPv6, sehingga socket()panggilan akan gagal seperti yang dapat kita lihat dalam kasus ini.

heemayl
sumber
1
Dalam praktiknya, bagaimanapun, /etc/foobar.confakan dibaca pertama, kemudian ~/.foobarrc, sehingga yang terakhir bisa menimpa yang pertama. Jadi, jika /etc/foobar.confmengandung garis yang mengatakan frobnitz=0, dan ~/.foobarrcmemiliki frobnitz=1, nilai yang terakhir berlaku
Monty Harder
@MontyHarder Itulah yang saya maksud dengan urutan prioritas ...
heemayl
Ya, urutan prioritas, bukan urutan membaca.
Monty Harder