web-dev-qa-db-fra.com

Passer des données binaires à curl sans utiliser de @file

Est-il possible d'utiliser curl et de publier des données binaires sans passer de nom de fichier? Par exemple, vous pouvez publier un formulaire en utilisant binaire via --data-binary:

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

Cependant, cela nécessite qu'un fichier existe. J'espérais pouvoir enregistrer les appels HTTP (tels que les services de repos) comme texte de la commande curl pour reproduire la demande. (cela facilite grandement le débogage de ces services, par exemple)

Cependant, la journalisation des commandes curl qui référencent un fichier ne serait pas utile, donc j'espérais pouvoir réellement enregistrer les données binaires brutes, vraisemblablement encodées en base64, tout en vous permettant de copier et coller la commande curl enregistrée et de l'exécuter.

Alors, est-il possible d'utiliser des données curl et post binaires sans référencer un fichier? Si oui, comment cela fonctionnerait-il? À quoi ressemblerait un exemple?

32
Kirk Woll

Vous pouvez passer des données en boucle via STDIN comme ceci:

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

Le @- indique à curl de se retirer de STDIN.

Pour diriger les données binaires vers curl (par exemple):

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

En ajoutant à this answer, la commande echo ajoute une nouvelle ligne à sa sortie par défaut. Cela ajoute un \n à la fin de vos données binaires, donc curl recevra également ce caractère en entrée.

Pour éviter cela, vous pouvez utiliser la commande printf ou -n basculer comme ceci:

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

ou

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

De cette façon, aucune nouvelle ligne ne sera ajoutée à l'entrée curl et les octets alimentés à curl seront exactement ceux que vous passez à echo.

0
robg

Je ne sais pas pourquoi, mais la ligne de commande exacte suggérée par slm n'a pas fonctionné pour moi. Avec une légère modification, les éléments suivants ont fonctionné:

echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt
0
Richard Nienaber