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

31

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?

Kirk Woll
la source
Si vous ne le connectez pas à un fichier, alors où le connectez-vous?
slm
@slm, je pense que vous vous méprenez. J'enregistre mes appels de repos côté client dans un fichier journal en texte brut (comme la commande curl équivalente mot à mot). Cependant, je ne veux pas avoir à référencer un fichier aléatoire pour chaque commande binaire curl que je connecte. Je veux que le texte entier de la commande curl soit entièrement autonome afin que quelqu'un puisse copier ce texte dans un terminal et l'exécuter pour reproduire l'appel.
Kirk Woll

Réponses:

45

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 @-dit curlde 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
slm
la source
Mais cela ne permet toujours pas aux données binaires de faire partie du texte de la commande curl. Ce n'est donc pas possible?
Kirk Woll
Ce que vous demandez ne semble pas réalisable. Les données de la commande curl peuvent être canalisées dans curl ou extraites via la fonction @ <nomfichier>. À ma connaissance, il n'y a pas d'autre méthode.
slm
1
En fait, votre réponse est parfaite - votre exemple devrait simplement utiliser le binaire à la place. :) ie echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com\x03\xF1sont les données binaires brutes en hexadécimal, ce qui est à peu près exactement ce que je veux.
Kirk Woll
Génial. Je ne te suivais pas entièrement. Donc, vous vouliez canaliser les données binaires en boucle, je pensais que vous demandiez autre chose. Heureux que cela ait fonctionné pour vous.
slm
2
J'ai essayé ceci: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Travaillé comme un charme. Pour valider, j'ai également essayé: cat 1.jpg | md5sumet md5sum 1.jpg. Ils ont tous deux retourné la même valeur.
dimitarvp
0

Je ne sais pas pourquoi, mais la ligne de commande exacte suggérée par slm ne fonctionnait pas 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
Richard Nienaber
la source
1
La raison en est que SFTP est un protocole entièrement différent de HTTP avec des capacités très différentes, et la page de manuel et le message d'aide disent --data-binary ne s'applique qu'à HTTP (et HTTPS).
dave_thompson_085
Ça a du sens. Je combinais plusieurs sources en ligne pour que cela fonctionne, alors j'ai raté la partie de la question qui le rendait spécifique à HTTP. Je laisse ma réponse ici au cas où quelqu'un d'autre en aurait besoin.
Richard Nienaber
0

Ajoutant à cette réponse, la echocommande 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 printfcommande ou le -ncommutateur 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 auxquels vous passez echo.

robg
la source