Bisakah CURL mengirim permintaan ke soket?


75

Saya memiliki server HTTP yang sedang berjalan /var/run/my-server.sock, dan saya ingin mengujinya dengan mengirimkan permintaan sederhana menggunakan cURL. Bisakah ini dilakukan dengan menggunakan CURL? Bisakah itu dilakukan sama sekali, atau haruskah ada proxy terbalik di tempat?

Saya membayangkan sesuatu seperti ini:

curl socket:/var/run/my-server.sock:/test/path

Jawaban:


107

Fitur ditambahkan dalam ikal 7.40.

curl --unix-socket /var/run/docker.sock http:/images/json

Contoh lain:

curl --no-buffer -XGET --unix-socket /docker.sock http:/events

Yang menentukan GETsecara eksplisit (bukan diasumsikan). Dan tidak akan buffer (untuk tail -fpembaruan realtime).

(Rilis Ubuntu pertama yang dikirim dengan curl 7.40 atau lebih baru adalah 15.10).

cURL 7.50 dan lebih tinggi memerlukan URL yang valid untuk disediakan , termasuk nama host, jadi untuk menjalankan contoh di atas dengan cURL 7.50, nama host "dummy" harus ditambahkan, misalnya:

curl --unix-socket /var/run/docker.sock http://localhost/images/json

dan

curl --no-buffer -XGET --unix-socket /docker.sock http://localhost/events

1
Ini luar biasa!
Hubro

Dan dalam contoh ini saya melihat soket yang saya tuju curl. Docker hidup panjang!
spacediver

Omong-omong, contoh netcat dan socat tidak lagi di atas :]
Hubro

Ini sangat berguna. Namun, saya mencoba melakukan ini curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://eventstetapi curl tidak dapat terhubung ke server. Saya mencoba menggunakan ruby ​​docker library dan terhubung dengan baik menggunakan ini
user1513388

1
@ user1513388 Saya cukup yakin Anda harus memberikan path ke soket sebagai argumen --unix-socket, bukan URI.
Hubro

8

Tidak yakin, tapi sesuai tiket ini:

sepertinya tidak demikian.

Per ini:

Sepertinya socat atau nc dapat melakukannya, snip dari snip di atas:

# Socat version
echo -e "GET /images/json HTTP/1.1\r\n" | socat unix-connect:/var/run/docker.sock STDIO

# nc version (netcat-freebsd)
echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock

Belum mencoba sendiri.


4
ini bekerja dengan pengecualian yang Anda bisa berikan \r\n\r\npada akhirnya, bukan\r\n echo -e "GET / HTTP/1.1\r\n\r\n"
TheRusskiy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.