จะส่งเส้นแบ่งด้วย curl ได้อย่างไร?


96

ฉันได้ลองทำสิ่งต่อไปนี้เพื่อส่งตัวแบ่งบรรทัดด้วย curl แต่ curl \nไม่ตีความ

curl -X PUT -d "my message\n" http://localhost:8000/hello

ฉันจะส่งตัวแบ่งบรรทัดด้วย curl ได้อย่างไร?


1
บนแพลตฟอร์มอะไร? อาจจะเกี่ยวข้อง
Pekka

คำตอบ:


116

บางครั้งคุณต้องการให้ข้อมูลที่จะส่งแบบคำต่อคำ

--data-binaryตัวเลือกไม่ว่า


2
วิธีนี้เป็นวิธีที่ดีที่สุด ทางเลือกในการใช้-d @message.txtตามที่แนะนำในคำตอบอื่นโดยเฉพาะสามารถเปลี่ยนการแบ่งบรรทัดของคุณได้ --data-binaryในทางกลับกันจะไม่ (ซึ่งเป็นสิ่งสำคัญหากคุณต้องการให้เส้นแบ่ง CRLF ของคุณสำหรับหลายส่วน / แบบฟอร์มข้อมูลโปรดดู: stackoverflow.com/questions/10765243/… )
William Denniss

9
เพราะฉันใช้เวลาสักครู่: หากคุณกำลังอัปโหลดไฟล์คุณอาจต้องการใช้ subshell สำหรับสิ่งนี้curl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana

น่าสนใจ แต่ข้อดีคืออะไร?
Szocske

8
+1 คำตอบที่ถูกต้อง curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski

4
ฉันไม่สามารถรับ - ข้อมูลไบนารีในการทำงาน แต่สามารถใช้คำตอบอักขระ% 0A (ดู @malcolmocean) เมื่อฉันใช้ --data-binary "ip = 33.44.55. * \ n5.6.7.8" จะไม่ถือว่าเป็น newline แต่ --data "" ip = 33.44.55. *% 0A5.6.7.8 "ส่งขึ้นบรรทัดใหม่ผ่าน
พอล

53

เปลือกของคุณจะผ่าน\ตามด้วยมากกว่าการขึ้นบรรทัดใหม่จะขดมากกว่าn "my message\n"ทุบตีมีการสนับสนุนสตริงไวยากรณ์ที่สนับสนุนลำดับหนีเหมือนอีกและ\n \tในการใช้งานให้เริ่มต้นสตริงด้วย$'และลงท้ายด้วย':

curl -X PUT -d $'my message\n' http://localhost:8000/hello

ดูการอ้างอิง ANSI-Cในคู่มืออ้างอิง Bash


1
สิ่งนี้ได้ผลสำหรับฉันด้วย ฉันจะต้องเล่นกับมันเพราะมันใช้ไม่ได้กับเครื่องหมายคำพูดคู่ซึ่งหมายความว่าฉันไม่สามารถใช้เครื่องหมายคำพูดเดี่ยวภายในสตริงได้
Tyler Collier

1
ฉันไม่รู้ว่าคุณได้แนวคิดนี้มาจากไหนว่านี่คือ "JavaScript shell syntax" กระสุนผ่านmy message\nคำต่อคำไม่ใช่การหนีสองครั้งอย่างที่คุณพูด
Chris Down

@ChrisDown คุณอ้างฉันผิด ฉันพูดว่า "ไวยากรณ์สตริง JavaScript" ไม่ใช่ "JavaScript shell syntax" ฉันใช้ไวยากรณ์สตริง JavaScript เพื่อให้ชัดเจนเกี่ยวกับความหมายของตัวอย่างสตริงของฉัน ผมคิดว่าสิ่งที่คุณกำลังหมายถึงเป็นเช่นเดียวกับสิ่งที่ผมหมายถึงเป็นmy message\n "my message\n"
Benjamin Atkin

2
@BenAtkin ขออภัยสลิปฟรอยด์ อย่างไรก็ตามการอ่านของฉันยังคงถูกต้อง \nไม่มีส่วนเกี่ยวข้องกับ JavaScript ในความเป็นจริงไม่มีอะไรเกี่ยวข้องกับ JavaScript เลย
Chris Down

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

17

มีวิธีที่ง่ายกว่ามาก!

curl -X PUT -d $'my message\n' http://localhost:8000/hello

สิ่งนี้จะใช้การอ้างอิง ANSI-Cเพื่อแทรกอักขระขึ้นบรรทัดใหม่

ไม่มีท่อไม่มีไฟล์ข้อมูล ดูเพิ่มเติมส่งขึ้นบรรทัดใหม่กับม้วน


คำตอบนั้นควรเป็นคำตอบที่ได้รับการยอมรับแม้ว่าจะใช้ไวยากรณ์ของ Bash
ก็ตาม

นี่เป็นสิ่งเดียวที่ได้ผลสำหรับฉันจากคำตอบทั้งหมด
Bob Kocisko

16

วิธีแก้ปัญหาสำหรับผู้ที่ไม่ต้องการใช้ไฟล์และไม่ต้องการหันไปใช้เวทมนตร์ที่หลบหนีคือ:

curl -X POST --data-binary @- http://url.com <<EOF
line one
line two
EOF

แต่นี่เป็นบรรทัดใหม่ตามตัวอักษรในส่วนข้อมูลโพสต์ไม่ใช่ในฟิลด์ฟอร์ม


ฉันมีปัญหาในการทำความเข้าใจเรื่องนี้ ฉันเข้าใจว่านั่น@คือการระบุชื่อไฟล์ แต่มีความหมายพิเศษเมื่อใช้@-หรือไม่? กำลัง<<EOFทำอะไรอยู่?
Dennis T

1
@-บอกให้ curl ใช้อินพุตจาก standard in และ<<EOFเป็นจุดสิ้นสุดของตัวบ่งชี้สตรีมสำหรับ bash จากนั้นเราใช้คำวิเศษEOFในส่วนข้อมูลเพื่อบอก bash ว่าเราเขียนไปยังสตรีมเสร็จแล้ว
Jammer

นอกจากนี้ยัง-จัดเรียงวิธีมาตรฐานใน GNU / Linux เพื่อระบุ STDIN เมื่อคาดว่าชื่อไฟล์ มันไม่เป็นสากล แต่เป็นเรื่องธรรมดา
Rich Remer

จากการดูคู่มือเราเห็นว่าควรเป็นเพียง - ไม่ใช่ @ -
user3504575

10

มีปัญหาที่คล้ายกัน ขณะอัปโหลดไฟล์ CSV จาก Mac ไปยังที่เก็บข้อมูลบนคลาวด์บรรทัดใหม่จะถูกลบออก หลังจากดาวน์โหลดไฟล์ทั้งหมดจะดูเหมือนเป็นบรรทัดเดียว ฉันพยายามเพิ่มอักขระ EOL ที่แตกต่างกัน แต่\n \r \r\nไม่ประสบความสำเร็จ ใช้--data-binaryแทนการ-dแก้ไขปัญหา

Btw ปัญหานี้เกิดขึ้นจาก Mac เท่านั้น -dทำงานได้ดีในขณะที่โทรจากเครื่อง CentOS สิ่งนี้ดูเหมือนมากเนื่องจากตัวละครใหม่ของ Mac แต่อย่ารู้สึกอยากแก้ไขข้อบกพร่องอีกต่อไป

ขอบคุณมาก ๆ สำหรับความช่วยเหลือของคุณ.

curl -X PUT -d @filename.csv https://cloudstorage -H "content-type: text/csv"

เทียบกับ

curl -X PUT --data-binary @filename.csv https://cloudstorage -H "content-type: text/csv"

ขอบคุณมาก ! สิ่งนี้ไม่เกี่ยวข้องกับ Mac ของคุณ: ฉันประสบปัญหาเดียวกันบน Linux และการใช้งาน--data-binary @ได้แก้ไขปัญหาของฉันแล้ว (ส่งไฟล์. ics หลายสายไปยังเซิร์ฟเวอร์ CalDAV)
M-Jack

8

(ฉันลงเอยด้วยคำถามที่แตกต่างกันเล็กน้อยดังนั้นฉันจะโพสต์คำตอบของฉันเพราะอาจช่วยนักสำรวจในอนาคตได้)

วิธีแก้ปัญหาของฉันใช้กับผู้ที่กำลังส่งข้อมูลรูปแบบเช่นคู่คีย์ / ค่าในสตริงแบบสอบถาม ใช้เส้นแบ่งเข้ารหัสซึ่งเป็นเช่นเดียวกับวิธีการที่พื้นที่เข้ารหัสเป็น%0A %20คุณสามารถใช้http://meyerweb.com/eric/tools/dencoder/เพื่อแปลงสัญลักษณ์อื่น ๆ

ดังนั้นหากคุณต้องการตั้งค่าคีย์messageเป็นค่า:

line one
another

คุณจะส่ง

curl --data "message=line%20one%0Aanother" http://localhost:8000/hello

1
ความคิดเห็นเล็กน้อย (อาจพิมพ์ผิด) สำหรับตัวแบ่งบรรทัด / อักขระส่งคืน carraige ควรเป็น% 0A แทนที่จะเป็น% A0
พอล

3

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

curl -X PUT -d @message.txt http://localhost:8000/hello

จากคู่มือ :

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


การใช้ไฟล์ชั่วคราวเป็นวิธีที่สะดวก ตามคำตอบของ Szocske --data-binaryเป็นทางเลือกที่ซื่อสัตย์-dกว่าเนื่องจากจะส่งข้อมูลแบบคำต่อคำ
William Denniss

7
-1; การใช้ไฟล์ชั่วคราวกับ-d @/path/to/temp/file.txtไม่ช่วยแก้ปัญหาการแบ่งบรรทัด --data-binaryดูด้านบน
Frank Olschewski

หากคุณเห็นสิ่งนี้เนื่องจากคุณสงสัยว่าทำไมคำสั่ง curl ของคุณไม่ทำงานหลังจากอัปเกรด curl หรืออัปเกรดเป็น windows 10 ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มเครื่องหมายคำพูดรอบการอ้างอิงไฟล์ของคุณ ตัวอย่างเช่น curl -X PUT -d "@ message.txt" localhost: 8000 / hello สคริปต์สร้างใหม่ของ elasticsearch หยุดทำงาน
joezen777

3

วิธีที่ง่ายมากเพียงแค่ Shift-Enter ในคอนโซลสำหรับช่วงพัก อ่านได้มากพิมพ์ด้วย

curl -d "line1
line2" http-echo.com

Server gets this: line1\nline2

ทำสิ่งนี้เพื่อลบเส้นแบ่ง:

curl -d "line1 \
line2" http-echo.com

Server gets this: line1 line2

-2

ฉันใช้ Sendgrid กับรหัสนี้ (คัดลอกด้านล่าง) พบที่นี่https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\n\nทำงานใน Gmail แต่\nถูกเพิกเฉย ฉันพยายามเพิ่มการหลบหนีและคำแนะนำอื่น ๆ เป็นสองเท่า ฉันลอง\r\nแล้วและก็ใช้ไม่ได้ใน Gmail เช่นกัน หมายเหตุ: ฉันไม่ได้กังวลที่จะทดสอบโปรแกรมรับส่งเมลอื่น ๆ เพราะอาจเป็นปัญหาเฉพาะของ Gmail

    curl --request POST \
  --url https://api.sendgrid.com/v3/mail/send \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"personalizations": [{"to": [{"email": "your.email@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}'

ในที่สุดฉันก็ล้มเลิกการมองหาวิธีแก้ปัญหาและเปลี่ยนtext/plainไปtext/htmlใช้<br />แท็กที่เพิ่งใช้

มีคนแนะนำว่า Sendgrid แปลงข้อความธรรมดาเป็น HTML หากคุณเปิดใช้งานพิกเซลการติดตามซึ่งก็สมเหตุสมผลดี บางทีบรรทัดใหม่อาจถูกทำลายในกระบวนการแปลงข้อความธรรมดาเป็น html ฉันถือว่าลูกค้าต้องการพิกเซลการติดตามดังนั้นจึงตัดสินใจเปลี่ยนไปใช้ HTML

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