การส่งผ่านข้อมูลไบนารีไปยัง curl โดยไม่ต้องใช้ @file


30

เป็นไปได้ไหมที่จะใช้ curl และโพสต์ข้อมูลไบนารีโดยไม่ผ่านชื่อไฟล์? ตัวอย่างเช่นคุณสามารถโพสต์แบบฟอร์มโดยใช้ไบนารีผ่าน --data-binary:

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

อย่างไรก็ตามสิ่งนี้ต้องการไฟล์ที่มีอยู่ ฉันหวังว่าจะสามารถบันทึกการโทร HTTP (เช่นเพื่อหยุดบริการ) เป็นข้อความของคำสั่ง curl ในการทำซ้ำการร้องขอ (สิ่งนี้จะช่วยในการดีบักบริการเหล่านี้เป็นอย่างมาก)

อย่างไรก็ตามการบันทึกคำสั่ง curl ที่อ้างอิงไฟล์จะไม่มีประโยชน์ดังนั้นฉันหวังว่าฉันจะสามารถบันทึกข้อมูลไบนารีแบบดิบได้โดยมีการเข้ารหัส base64 น่าจะเป็นจริง แต่ก็ยังให้คุณคัดลอกและวางคำสั่ง curl ที่บันทึกไว้

ดังนั้นเป็นไปได้ที่จะใช้ curl และโพสต์ข้อมูลไบนารีโดยไม่ต้องอ้างอิงไฟล์หรือไม่? ถ้าเป็นเช่นนั้นจะทำงานอย่างไร ตัวอย่างจะมีลักษณะเป็นอย่างไร


หากคุณไม่ได้เข้าสู่ระบบไฟล์คุณจะทำการบันทึกที่ไหน?
slm

@slm ฉันคิดว่าคุณเข้าใจผิด ฉันกำลังบันทึกส่วนที่เหลือฝั่งไคลเอ็นต์ของฉันโทรไปยังไฟล์บันทึกเป็นข้อความธรรมดา (เป็นคำสั่ง curl เทียบเท่าคำต่อคำ) อย่างไรก็ตามฉันไม่ต้องการให้มีการอ้างอิงไฟล์สุ่มบางคำสั่งสำหรับคำสั่งเลขฐานสองที่ฉันบันทึกไว้ ฉันต้องการให้ข้อความทั้งหมดของคำสั่ง curl มีอยู่ในตัวเองอย่างสมบูรณ์เพื่อให้บางคนสามารถคัดลอกข้อความนั้นลงในเทอร์มินัลแล้วเรียกใช้เพื่อสร้างการโทรซ้ำ
Kirk Woll

คำตอบ:


45

คุณสามารถส่งผ่านข้อมูลเข้าสู่ curl ผ่าน STDIN ได้ดังนี้:

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

การ@-บอกcurlให้ดึงเข้าจาก STDIN

ในการไพพ์ข้อมูลไบนารีไปยัง curl (ตัวอย่าง):

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

แต่สิ่งนี้ยังไม่อนุญาตให้ข้อมูลไบนารีเป็นส่วนหนึ่งของข้อความของคำสั่ง curl เป็นไปไม่ได้เหรอ?
Kirk Woll

สิ่งที่คุณต้องการไม่เป็นไปได้ ข้อมูลไปยังคำสั่ง curl สามารถถูกส่งไปยัง curl หรือดึงเข้าไปในสิ่งอำนวยความสะดวก @ <filename> สำหรับความรู้ของฉันไม่มีวิธีอื่นใด
slm

1
ที่จริงแล้วคำตอบของคุณสมบูรณ์แบบตัวอย่างของคุณควรใช้เลขฐานสองแทน :) คือ echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com ที่ไหน\x03\xF1เป็นข้อมูลไบนารีดิบเป็นเลขฐานสิบหกซึ่งเป็นสวยมากสิ่งที่ฉันต้องการ
Kirk Woll

ยิ่งใหญ่ ฉันไม่ได้ติดตามคุณอย่างสิ้นเชิง ดังนั้นคุณ jut ต้องการไปที่ data binary binary ใน curl ฉันคิดว่าคุณกำลังขออย่างอื่น ดีใจที่ได้ผลกับคุณ
slm

2
ฉันลองสิ่งนี้: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. ทำงานเหมือนจับใจ ในการตรวจสอบ, ฉันยังพยายาม: และcat 1.jpg | md5sum md5sum 1.jpgพวกเขาทั้งสองคืนค่าเดียวกัน
dimitarvp

0

ไม่แน่ใจว่าทำไม แต่บรรทัดคำสั่งที่แน่นอนที่ slm ที่แนะนำไม่ทำงานสำหรับฉัน ด้วยการปรับเปลี่ยนเล็กน้อยการทำงานต่อไปนี้:

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

1
เหตุผลก็คือว่า SFTP เป็นโปรโตคอลที่แตกต่างอย่างสิ้นเชิงจาก HTTP ที่มีความสามารถที่แตกต่างกันมากและทั้งหน้า man และข้อความช่วยเหลือบอกว่า - data-binary ใช้กับ HTTP (และ HTTPS) เท่านั้น
dave_thompson_085

นั่นทำให้รู้สึก ฉันกำลังรวมแหล่งข้อมูลออนไลน์หลายแห่งเพื่อให้ทำงานได้ดังนั้นฉันจึงพลาดคำถามส่วนหนึ่งซึ่งทำให้เป็น HTTP เฉพาะ ฉันจะทิ้งคำตอบไว้ที่นี่ในกรณีที่คนอื่นต้องการ
Richard Nienaber

0

การเพิ่มคำตอบนี้จะเพิ่มechoบรรทัดใหม่ให้กับเอาต์พุตโดยดีฟอลต์ นี่เป็นการเพิ่ม\nไปยังจุดสิ้นสุดของข้อมูลไบนารี่ของคุณดังนั้น curl จะได้รับตัวละครนั้นเช่นเดียวกับการป้อนข้อมูล

เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้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วิธีนี้ไม่มีการขึ้นบรรทัดใหม่จะได้รับการผนวกเข้ากับการป้อนข้อมูลขดและไบต์ที่ถูกป้อนให้กับขดจะตรงที่คุณส่งผ่านไปยัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.