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
Hubro
sumber

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
Dreamcat4
sumber
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.

hujan stabil
sumber
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