Melewati data biner ke ikal tanpa menggunakan @file

31

Apakah mungkin menggunakan curl dan memposting data biner tanpa mengirimkan nama file? Misalnya, Anda dapat memposting formulir menggunakan biner melalui --data-binary:

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

Namun, ini mensyaratkan bahwa ada file. Saya berharap dapat mencatat panggilan HTTP (seperti untuk mengembalikan layanan) sebagai teks dari perintah curl untuk mereproduksi permintaan. (ini sangat membantu men-debug layanan ini, misalnya)

Namun, logging perintah curl yang mereferensikan file tidak akan berguna, jadi saya berharap saya benar-benar bisa mencatat data biner mentah, mungkin base64 yang dikodekan, namun masih memungkinkan Anda untuk menyalin dan menempelkan perintah curl yang dicatat dan menjalankannya.

Jadi, apakah mungkin menggunakan curl dan mengirim data biner tanpa merujuk file? Jika demikian, bagaimana cara kerjanya? Seperti apa contohnya?

Kirk Woll
sumber
Jika Anda tidak masuk ke file lalu ke mana Anda masuk?
slm
@ sdm, saya pikir Anda salah paham. Saya mencatat panggilan istirahat sisi klien saya ke file log dalam teks biasa (sebagai perintah curl setara verbatim). Namun, saya tidak ingin harus mereferensikan beberapa file acak untuk setiap perintah I biner ikal. Saya ingin seluruh teks dari perintah curl sepenuhnya mandiri sehingga seseorang dapat menyalin teks itu ke terminal dan menjalankannya untuk mereproduksi panggilan.
Kirk Woll

Jawaban:

45

Anda dapat mengirimkan data ke curl melalui STDIN seperti:

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

The @-Tells curluntuk menarik dari STDIN.

Untuk menyalurkan data biner ke ikal (misalnya):

echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com
slm
sumber
Tapi ini masih tidak memungkinkan data biner menjadi bagian dari teks perintah curl. Jadi, apakah itu tidak mungkin?
Kirk Woll
Apa yang Anda minta tidak terdengar masuk akal. Data ke perintah curl dapat disalurkan ke curl atau ditarik melalui fasilitas @ <filename>. Setahu saya tidak ada metode lain.
slm
1
Sebenarnya, jawaban Anda sempurna - contoh Anda seharusnya menggunakan biner saja. :) yaitu echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com Di mana \x03\xF1data biner mentah sebagai heksadesimal, yang persis seperti yang saya inginkan.
Kirk Woll
Besar. Saya tidak mengikuti Anda sepenuhnya. Jadi Anda hanya ingin menyalurkan data biner ke ikal, saya pikir Anda meminta sesuatu yang lain. Senang itu berhasil untuk Anda.
slm
2
Saya mencoba ini: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Bekerja seperti pesona. Untuk memvalidasi, saya juga mencoba: cat 1.jpg | md5sumdan md5sum 1.jpg. Mereka berdua mengembalikan nilai yang sama.
dimitarvp
0

Tidak yakin mengapa, tetapi baris perintah persis yang disarankan slm tidak bekerja untuk saya. Dengan sedikit modifikasi, berikut ini berfungsi:

echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt
Richard Nienaber
sumber
1
Alasan mengapa SFTP adalah protokol yang sama sekali berbeda dari HTTP dengan kemampuan yang sangat berbeda, dan kedua halaman manual dan pesan bantuan mengatakan - data-binary hanya berlaku untuk HTTP (dan HTTPS).
dave_thompson_085
Itu masuk akal. Saya menggabungkan beberapa sumber online untuk membuatnya berfungsi, jadi saya melewatkan bagian dari pertanyaan yang membuatnya spesifik HTTP. Saya akan meninggalkan jawaban saya di sini kalau-kalau ada orang lain yang membutuhkannya.
Richard Nienaber
0

Menambahkan ke jawaban ini , echoperintah menambahkan baris baru ke outputnya secara default. Ini menambahkan a \nke akhir data biner Anda, oleh karena itu curl akan menerima karakter itu juga sebagai input.

Untuk menghindari itu, Anda dapat menggunakan printfperintah atau -nsakelar seperti:

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

atau

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

Dengan cara ini, tidak ada baris baru akan ditambahkan ke input curl dan byte yang diumpankan ke curl akan persis seperti yang Anda berikan echo.

robg
sumber