Bir @file kullanmadan kıvrılmak için ikili verileri geçirme


30

Curl kullanmak ve ikili veriyi bir dosya ismini geçmeden kullanmak mümkün mü? Örneğin, --data-binary üzerinden ikili kullanarak bir form gönderebilirsiniz:

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

Ancak, bu bir dosyanın var olmasını gerektirir. İsteği yeniden oluşturmak için HTTP çağrılarını (servisleri dinletmek gibi) günlüğe kaydetmeyi umuyordum. (örneğin, bu hizmetlerin hata ayıklamasını büyük ölçüde kolaylaştırır)

Bununla birlikte, günlük kıvırma komutları, bir dosyaya başvuruda bulunmanın yararlı olmayacağını, bu nedenle, muhtemelen base64 kodlu ham ikili verileri günlüğe kaydedebileceğimi ve yine de günlüğe kaydedilen kıvrılma komutunu kopyalayıp yapıştırabilmenizi ve yürütebilmenizi umduğumu umuyorum.

Peki, kıvrılma kullanmak ve bir ikili dosyaya gönderme yapmadan dosyaya başvurmak mümkün müdür? Eğer öyleyse, bu nasıl işe yarar? Bir örnek neye benzerdi?


Bir dosyaya giriş yapmıyorsanız, o zaman nereye giriş yapıyorsunuz?
slm

@slm, sanırım yanlış anladınız. İstemci tarafımın dinlenme çağrılarını bir günlük dosyasına düz metin olarak yazıyorum (verbatim eşdeğer kıvrılma komutu olarak). Ancak, giriş yaptığım her ikilik kıvrılma komutu için rastgele bir dosyaya başvurmak istemiyorum. Curl komutunun tüm metninin tamamen kendi kendine yetmesini istiyorum, böylece biri bu metni bir terminale kopyalayıp aramayı yeniden oluşturmak için çalıştırabilir.
Kirk Woll,

Yanıtlar:


45

Verileri STDIN ile aşağıdaki gibi kıvrıla aktarabilirsiniz:

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

@-Söyler curlSTDIN'den çekmek için.

İkili verileri kıvrılmaya yönlendirmek için (örneğin):

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

Ancak bu hala ikili verilerin curl komutu metninin bir parçası olmasına izin vermiyor. Yani bu mümkün değil mi?
Kirk Woll,

İstediğiniz şey uygun görünmüyor. Kıvrılma komutunun verileri kıvrılmayla birleştirilebilir ya da @ <dosyaadı> özelliği kullanılarak çekilebilir. Bildiğim kadarıyla başka bir yöntem yoktur.
slm

1
Aslında, cevabınız mükemmel - örneğiniz yerine sadece ikili kullanmanız gerekir. :) yani echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com Ondalık \x03\xF1olarak ham ikili veri nerede , bu tam olarak istediğim şey.
Kirk Woll,

Harika. Seni tamamen takip etmiyordum. Jut, ikili verileri kıvrılmaya sokmak istedi, başka bir şey istediğini sanıyordum. Senin için çalışmasına sevindim.
slm

2
Bu çalıştı: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Bir cazibe gibi çalıştı. Doğrulamak için de denedim: cat 1.jpg | md5sumve md5sum 1.jpg. Her ikisi de aynı değeri verdi.
dimitarvp

0

Neden olduğundan emin değilim, ancak slm'in önerdiği komut satırı benim için işe yaramadı. Küçük bir değişiklikle, aşağıdakiler işe yaradı:

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

1
Bunun nedeni SFTP'nin HTTP'den çok farklı özelliklere sahip tamamen farklı bir protokoldür ve hem man sayfası hem de yardım mesajı --data-binary sadece HTTP (ve HTTPS) için geçerlidir.
dave_thompson_085

Bu mantıklı. Bu çalışmayı sağlamak için birkaç çevrimiçi kaynağı birleştiriyordum, bu yüzden soruyu HTTP'ye özgü yapan kısmı kaçırdım. Başka birinin ihtiyaç duyması durumunda cevabımı burada bırakacağım.
Richard Nienaber 10:17

0

Ekleme Bu cevap, echokomut varsayılan olarak onun çıkışına bir yeni satır ekler. Bu \n, ikili verilerinizin sonuna a ekler , bu nedenle kıvrılma bu karakteri girdi olarak alır.

Bundan kaçınmak için, printfkomutu veya -nanahtarı aşağıdaki gibi kullanabilirsiniz :

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

veya

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

Bu şekilde curl girişine hiçbir yeni satır eklenmeyecek ve curl'e beslenen baytlar tam olarak geçtiğinizler olacaktır echo.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.