¿Puede cURL enviar solicitudes a sockets?

75

Tengo un servidor HTTP ejecutándose /var/run/my-server.socky quiero probarlo enviando una solicitud simple usando cURL. ¿Se puede hacer esto usando cURL? ¿Se puede hacer o debe haber un proxy inverso?

Me estoy imaginando algo como esto:

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

Respuestas:

107

La característica se agregó en curl 7.40.

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

Otro ejemplo:

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

Que especifica GETexplícitamente (en lugar de asumir). Y no se almacenará en el búfer (para tail -fla actualización en tiempo real).

(La primera versión de Ubuntu que se envió con curl 7.40 o posterior fue 15.10).

cURL 7.50 y versiones posteriores requieren que se proporcione una URL válida , incluido un nombre de host, por lo que para ejecutar los ejemplos anteriores con cURL 7.50, se debe agregar un nombre de host "ficticio", por ejemplo:

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

y

curl --no-buffer -XGET --unix-socket /docker.sock http://localhost/events
Dreamcat4
fuente
1
¡Esto es asombroso!
Hubro
Y en este ejemplo, veo el mismo socket al que iba a ir curldespués de todo. ¡Viva Docker!
spacediver
Por cierto, los ejemplos de netcat y socat ya no están arriba :]
Hubro
Esto es realmente útil. Sin embargo, estoy tratando de hacer esto, curl --no-buffer -XGET --unix-socket tcp://192.168.99.102:2376 http://eventspero curl no se puede conectar al servidor. He intentado utilizar la biblioteca de rubí ventana acoplable y se conecta muy bien el uso de este
user1513388
1
@ user1513388 Estoy bastante seguro de que debe proporcionar la ruta a un socket como argumento para --unix-socket, no un URI.
Hubro
8

No estoy seguro, pero según este boleto:

No parece ser el caso.

Por esto:

parece que socat o nc pueden hacerlo, recorte del recorte anterior:

# 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

Yo tampoco lo he intentado.

lluvia constante
fuente
44
funciona con la excepción de que puede proporcionar \r\n\r\nal final, no\r\n echo -e "GET / HTTP/1.1\r\n\r\n"
TheRusskiy