Pasar datos binarios a curl sin usar un archivo @

31

¿Es posible usar curl y publicar datos binarios sin pasar un nombre de archivo? Por ejemplo, puede publicar un formulario usando binario a través de --data-binary:

curl -X POST --data-binary @myfile.bin http://foo.com

Sin embargo, esto requiere que exista un archivo. Esperaba poder registrar llamadas HTTP (como descansar servicios) como el texto del comando curl para reproducir la solicitud. (esto ayuda enormemente a depurar estos servicios, por ejemplo)

Sin embargo, registrar comandos curl que hagan referencia a un archivo no sería útil, por lo que esperaba poder registrar los datos binarios sin procesar, presumiblemente codificados en base64, y aún así permitirle copiar y pegar el comando curl registrado y ejecutarlo.

Entonces, ¿es posible usar curl y publicar datos binarios sin hacer referencia a un archivo? Si es así, ¿cómo funcionaría eso? ¿Cómo sería un ejemplo?

Kirk Woll
fuente
Si no lo está registrando en un archivo, ¿dónde lo está registrando?
slm
@slm, creo que lo malinterpretas. Estoy registrando mis llamadas de descanso del lado del cliente en un archivo de registro en texto sin formato (como el comando curl equivalente literal). Sin embargo, no quiero tener que hacer referencia a algún archivo aleatorio para cada comando binario curl que registro. Quiero que todo el texto del comando curl sea completamente autónomo para que alguien pueda copiar ese texto en un terminal y ejecutarlo para reproducir la llamada.
Kirk Woll

Respuestas:

45

Puede pasar datos a curl a través de STDIN de esta manera:

echo -e '...data...\n' | curl -X POST --data-binary @- http://foo.com

El @-le dice curla tirar desde STDIN.

Para canalizar datos binarios a curl (por ejemplo):

echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com
slm
fuente
Pero esto todavía no permite que los datos binarios sean parte del texto del comando curl. Entonces, ¿eso no es posible?
Kirk Woll,
Lo que estás pidiendo no parece factible. Los datos del comando curl se pueden canalizar a curl o extraer a través de la función @ <nombre de archivo>. Que yo sepa, no hay otro método.
slm
1
En realidad, su respuesta es perfecta: su ejemplo solo debería usar binario. :) es decir, echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com ¿dónde \x03\xF1están los datos binarios en bruto como hexadecimales, que es casi exactamente lo que quiero.
Kirk Woll
Excelente. No te estaba siguiendo por completo. Entonces, solo quería canalizar datos binarios en curl, pensé que estaba pidiendo algo más. Gustoso de trabajar para ti.
slm
2
He intentado esto: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Trabajado como un encanto. Para validar, también probé: cat 1.jpg | md5sumy md5sum 1.jpg. Ambos devolvieron el mismo valor.
dimitarvp
0

No estoy seguro de por qué, pero la línea de comando exacta que sugirió slm no funcionó para mí. Con una ligera modificación, funcionó lo siguiente:

echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt
Richard Nienaber
fuente
1
La razón es que SFTP es un protocolo completamente diferente de HTTP con capacidades muy diferentes, y tanto la página de manual como el mensaje de ayuda dicen que --data-binary solo se aplica a HTTP (y HTTPS).
dave_thompson_085
Eso tiene sentido. Estaba combinando varias fuentes en línea para que funcionara, así que me perdí la parte de la pregunta que lo hacía específico de HTTP. Dejaré mi respuesta aquí en caso de que alguien más lo necesite.
Richard Nienaber
0

Además de esta respuesta, el echocomando agrega una nueva línea a su salida de forma predeterminada. Esto agrega un \nal final de sus datos binarios, por lo tanto, curl recibirá ese carácter también como entrada.

Para evitar eso, puede usar el printfcomando o el -ninterruptor de la siguiente manera:

printf '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

o

echo -en '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

De esta forma, no se agregará una nueva línea a la entrada de curl y los bytes que se alimentan a curl serán exactamente aquellos a los que pasa echo.

robg
fuente