125 votes

Peut cURL envoyer des requêtes à des sockets ?

J'ai un serveur HTTP qui s'exécute à /var/run/my-server.sock, et je veux le tester en envoyant une requête simple en utilisant cURL. Est-ce que cela peut être fait en utilisant cURL? Est-ce possible, ou doit-il y avoir un proxy inverse en place?

Je m'imagine quelque chose comme ceci:

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

183voto

Dreamcat4 Points 1689

La fonctionnalité a été ajoutée dans curl 7.40.

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

Un autre exemple:

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

Qui spécifie explicitement le GET (plutôt que supposé). Et ne tamponnera pas (pour une mise à jour en temps réel de type tail -f).

(La première version d'Ubuntu à être livrée avec curl 7.40 ou ultérieur était la 15.10).

cURL 7.50 et supérieur requiert une URL valide à fournir, comprenant un nom d'hôte, donc pour exécuter les exemples ci-dessus avec cURL 7.50, un nom d'hôte "factice" doit être ajouté, par exemple:

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

et

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

1 votes

Et dans cet exemple, je vois le socket même dans lequel j'allais faire un curl après tout. Vive Docker !

0 votes

Au fait, les exemples de netcat et socat ne sont plus ci-dessus :]

0 votes

Ceci est vraiment utile. Cependant, j'essaie de faire ceci curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://events mais curl ne peut pas se connecter au serveur. J'ai essayé en utilisant la bibliothèque docker ruby et ça se connecte bien en utilisant ceci

13voto

steady rain Points 528

Pas sûr, mais selon ce ticket :

il ne semble pas que ce soit le cas.

Concernant ceci :

il semble que socat ou nc peuvent le faire, extrait du snip ci-dessus :

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

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

Je n'ai personnellement essayé ni l'un ni l'autre.

6 votes

Cela fonctionne à l'exception que vous pouvez fournir \r\n\r\n à la fin, pas \r\n echo -e "GET / HTTP/1.1\r\n\r\n"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X