Passando i dati binari per arricciare senza usare un file @


31

È possibile utilizzare l'arricciatura e pubblicare dati binari senza passare un nome di file? Ad esempio, puoi pubblicare un modulo usando binario tramite --data-binary:

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

Tuttavia, ciò richiede l'esistenza di un file. Speravo di essere in grado di registrare le chiamate HTTP (come ad esempio i servizi di riposo) come testo del comando curl per riprodurre la richiesta. (questo aiuta notevolmente il debug di questi servizi, per esempio)

Tuttavia, la registrazione dei comandi di arricciatura che fanno riferimento a un file non sarebbe utile, quindi speravo di poter effettivamente registrare i dati binari grezzi, presumibilmente codificati in base64, e tuttavia consentire comunque di copiare e incollare il comando di arricciatura registrato ed eseguirlo.

Quindi, è possibile utilizzare curl e pubblicare dati binari senza fare riferimento a un file? In tal caso, come funzionerebbe? Come sarebbe un esempio?


Se non lo stai registrando su un file, allora dove lo stai registrando?
slm

@slm, penso che tu fraintenda. Sto registrando le mie chiamate di riposo lato client su un file di registro in testo semplice (come il comando di arricciatura equivalente testuale). Tuttavia, non voglio dover fare riferimento ad alcuni file casuali per ogni comando binario di arricciatura che registro. Voglio che l'intero testo del comando curl sia completamente autonomo in modo che qualcuno possa copiare quel testo in un terminale ed eseguirlo per riprodurre la chiamata.
Kirk Woll,

Risposte:


45

È possibile passare i dati in arricciatura tramite STDIN in questo modo:

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

La @-dice curldi tirare in da STDIN.

Per convogliare i dati binari per arricciare (ad esempio):

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

Ma ciò non consente ancora ai dati binari di far parte del testo del comando curl. Quindi non è possibile?
Kirk Woll,

Quello che stai chiedendo non sembra fattibile. I dati al comando curl possono essere reindirizzati o arricciati tramite la funzione @ <nomefile>. Per quanto ne sappia, non esiste nessun altro metodo.
slm

1
In realtà, la tua risposta è perfetta - il tuo esempio dovrebbe usare semplicemente binario. :) cioè echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com dove \x03\xF1sono i dati binari grezzi come esadecimali, che è praticamente esattamente quello che voglio.
Kirk Woll,

Grande. Non ti stavo seguendo del tutto. Quindi volevi semplicemente incanalare i dati binari in un ricciolo, pensavo che stessi chiedendo qualcos'altro. Sono contento che abbia funzionato per te.
slm

2
Ho provato questo: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Ha funzionato come un fascino. Per convalidare, ho anche provato: cat 1.jpg | md5sume md5sum 1.jpg. Entrambi hanno restituito lo stesso valore.
dimitarvp,

0

Non so perché, ma l'esatta riga di comando suggerita da slm non ha funzionato per me. Con una leggera modifica, ha funzionato:

echo -e '...data...\n' | curl -s -T - sftp://user@10.10.10.10/~/test.txt

1
Il motivo è che SFTP è un protocollo completamente diverso da HTTP con funzionalità molto diverse, e sia la pagina man che il messaggio di aiuto dicono: i dati binari si applicano solo a HTTP (e HTTPS).
dave_thompson_085,

Ciò ha senso. Stavo combinando diverse fonti online per farlo funzionare, quindi ho perso la parte della domanda che lo rendeva specifico per HTTP. Lascio la mia risposta qui nel caso qualcun altro ne abbia bisogno.
Richard Nienaber,

0

Aggiungendo a questa risposta, il echocomando aggiunge di default una nuova riga al suo output. Questo aggiunge un \nalla fine dei tuoi dati binari, quindi l'arricciatura riceverà anche quel carattere come input.

Per evitarlo, puoi usare il printfcomando o l' -ninterruttore in questo modo:

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

o

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

In questo modo nessuna nuova riga verrà aggiunta all'input di arricciatura e i byte che vengono inviati all'arricciatura saranno esattamente quelli a cui si passa echo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.