@File का उपयोग किए बिना कर्ल करने के लिए द्विआधारी डेटा पास करना


31

क्या फ़ाइल नाम में पास किए बिना कर्ल और बाइनरी डेटा का उपयोग करना संभव है? उदाहरण के लिए, आप बाइनरी का उपयोग करके एक फॉर्म पोस्ट कर सकते हैं --डेटा-बाइनरी:

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

हालाँकि, इसके लिए यह आवश्यक है कि कोई फ़ाइल मौजूद हो। मैं अनुरोध को पुन: उत्पन्न करने के लिए कर्ल कमांड के पाठ के रूप में HTTP कॉल (जैसे सेवाओं को आराम करने) में लॉग इन करने में सक्षम होने की उम्मीद कर रहा था। (यह उदाहरण के लिए इन सेवाओं को डीबग करने में सहायता करता है)

हालाँकि, लॉगिंग कर्ल कमांड जो एक फाइल को संदर्भित करता है, उपयोगी नहीं होगा, इसलिए मैं उम्मीद कर रहा था कि मैं वास्तव में कच्चे बाइनरी डेटा को लॉग कर सकता हूं, संभवतः बेस 64 एनकोडेड, और फिर भी आपको लॉग कर्ल कमांड को कॉपी और पेस्ट करने की अनुमति देता है और इसे निष्पादित करता है।

तो, क्या किसी फ़ाइल को संदर्भित किए बिना कर्ल और बाइनरी डेटा का उपयोग करना संभव है? यदि हां, तो यह कैसे काम करेगा? एक उदाहरण कैसा दिखेगा?


यदि आप इसे किसी फ़ाइल में लॉग नहीं कर रहे हैं तो आप इसे कहां लॉग कर रहे हैं?
SLM

@slm, मुझे लगता है कि आप गलत समझ रहे हैं। मैं अपने क्लाइंट-साइड रेस्ट कॉल्स को सादा पाठ में लॉग फ़ाइल में प्रवेश कर रहा हूं (वर्बटीम समतुल्य कर्ल कमांड के रूप में)। हालाँकि, मैं प्रत्येक बाइनरी कर्ल कमांड I लॉग के लिए कुछ यादृच्छिक फ़ाइल का संदर्भ नहीं लेना चाहता। मैं चाहता हूं कि कर्ल कमांड का पूरा पाठ पूरी तरह से आत्म-निहित हो, ताकि कोई उस पाठ को एक टर्मिनल में कॉपी कर सके और कॉल को पुन: उत्पन्न करने के लिए उसे चला सके।
कर्क वल्ल

जवाबों:


45

आप डेटा को STDIN जैसे कर्ल में पास कर सकते हैं:

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

@-बताता है curlstdin से में खींचने के लिए।

बाइनरी डेटा को कर्ल में पाइप करने के लिए (उदाहरण के लिए):

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

लेकिन यह अभी भी बाइनरी डेटा को कर्ल कमांड के पाठ का हिस्सा नहीं होने देता है। तो क्या यह संभव नहीं है?
कर्क वल्ल

आप जो मांग रहे हैं वह संभव नहीं है। कर्ल कमांड का डेटा या तो कर्ल में पाइप किया जा सकता है या @ <फ़ाइल नाम> सुविधा के माध्यम से खींचा जा सकता है। मेरे ज्ञान के लिए कोई अन्य तरीका नहीं है।
SLM

1
वास्तव में, आपका उत्तर एकदम सही है - आपके उदाहरण को केवल बाइनरी का उपयोग करना चाहिए। :) यानी हेक्साडेसिमल के रूप में कच्चा बाइनरी डेटा echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com कहां \x03\xF1है, जो कि वास्तव में बहुत कुछ है जो मैं चाहता हूं।
कर्क वॉक

महान। मैं पूरी तरह से आपका पीछा नहीं कर रहा था। तो आप बाइनरी डेटा को कर्ल में पाइप करना चाहते थे, मुझे लगा कि आप कुछ और मांग रहे हैं। खुशी है कि यह आपके लिए कारगर रहा।
SLM

2
मैंने यह कोशिश की cat 1.jpg | curl -X POST --data-binary @- http://foo.com:। एक जादू की तरह काम किया। मान्य करने के लिए, मैंने भी कोशिश की: cat 1.jpg | md5sumऔर md5sum 1.jpg। वे दोनों एक ही मूल्य लौटाते थे।
dimitarvp

0

यकीन नहीं क्यों, लेकिन एसएलएम का सुझाव दिया सटीक लाइन मेरे लिए काम नहीं किया। एक मामूली संशोधन के साथ, निम्नलिखित काम किया:

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

1
ऐसा क्यों है कि SFTP बहुत अलग क्षमताओं के साथ HTTP से एक पूरी तरह से अलग प्रोटोकॉल है, और दोनों आदमी पृष्ठ और मदद संदेश कहते हैं - डेटा-बाइनरी केवल HTTP (और HTTPS) पर लागू होता है।
dave_thompson_085 10:05 17:05

यह समझ आता है। मैं उस काम को करने के लिए कई ऑनलाइन स्रोतों का संयोजन कर रहा था, इसलिए मैंने उस प्रश्न के भाग को याद किया जो इसे HTTP विशिष्ट बनाता था। मैं अपना जवाब यहाँ छोड़ दूंगा जब किसी और को इसकी आवश्यकता होगी।
रिचर्ड नीनाबेर

0

को जोड़ना इस सवाल का जवाब, echoआदेश डिफ़ॉल्ट रूप से इसके उत्पादन के लिए एक नई पंक्ति जोड़ देता है। यह \nआपके बाइनरी डेटा के अंत में जोड़ता है , इसलिए कर्ल को वह पात्र भी इनपुट के रूप में प्राप्त होगा।

printfउससे बचने के लिए, आप कमांड या -nस्विच का उपयोग कर सकते हैं :

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

या

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

इस तरह से कर्ल इनपुट के लिए कोई नई रेखा नहीं जोड़ी जाएगी और कर्ल को खिलाए जाने वाले बाइट बिल्कुल वही होंगे जो आप पास करते हैं echo

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.