Làm thế nào để gửi ngắt dòng với curl?


90

Tôi đã thử cách sau để gửi ngắt dòng bằng curl, nhưng \nkhông được giải thích bằng curl.

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

Làm cách nào để gửi ngắt dòng với curl?


1
Trên nền tảng nào? Có thể có liên quan
Pekka

Câu trả lời:


114

Đôi khi bạn muốn cung cấp dữ liệu được gửi nguyên văn.

Các --data-binarytùy chọn nào đó.


2
Đây là cách tốt nhất để làm điều đó. Việc thay thế sử dụng -d @message.txtnhư được đề xuất trong câu trả lời khác nói riêng có thể thay đổi ngắt dòng của bạn. --data-binarymặt khác sẽ không (đó là quan trọng nếu bạn cần phải giữ linebreaks CRLF của bạn cho multipart / form-data, xem: stackoverflow.com/questions/10765243/... )
William Denniss

8
Bởi vì nó đã cho tôi một giây: nếu bạn đang tải lên một tập tin có thể bạn sẽ muốn sử dụng một subshell cho điều nàycurl -H "Content-Type:text/plain" --data-binary "$(<myfile)" http://localhost:8888
mikemaccana

Thú vị, nhưng lợi thế là gì?
Szocske

8
+1, câu trả lời đúng. curl --data-binary @/path/to/file.txt http://example.com/target
Frank Olschewski

3
Tôi không thể lấy --data-binary để hoạt động nhưng có thể sử dụng câu trả lời ký tự% 0A (xem @malcolmocean). Khi tôi sử dụng --data-binary "ip = 33.44.55. * \ N5.6.7.8", nó không coi nó là dòng mới, nhưng --data "" ip = 33.44.55. *% 0A5.6.7.8 "gửi dòng mới qua
Paul

51

Vỏ của bạn đi qua \theo sau nchứ không phải là một đường mới để cuộn tròn hơn là "my message\n". Bash có hỗ trợ cho một cú pháp chuỗi khác hỗ trợ các chuỗi thoát như \n\t. Để sử dụng nó, hãy bắt đầu chuỗi bằng $'và kết thúc chuỗi bằng ':

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

Xem Trích dẫn ANSI-C trong Sổ tay Tham khảo Bash


1
Điều này cũng làm việc cho tôi. Tôi sẽ phải thử với nó, vì nó không hoạt động với dấu ngoặc kép, có nghĩa là tôi không thể sử dụng dấu ngoặc đơn trong chuỗi.
Tyler Collier

1
Tôi không biết bạn lấy ý tưởng này từ đâu rằng đây là "cú pháp trình bao JavaScript". Vỏ vượt qua my message\nnguyên văn, không phải với hai lần thoát như bạn nói.
Chris Down

@ChrisDown, bạn trích dẫn sai cho tôi. Tôi đã nói "cú pháp chuỗi JavaScript", không phải "cú pháp trình bao JavaScript". Tôi đang sử dụng cú pháp chuỗi JavaScript để hiểu rõ ý tôi với các ví dụ về chuỗi của mình. Tôi nghĩ những gì bạn đang đề cập đến cũng my message\ngiống như những gì tôi đang đề cập đến "my message\n".
Benjamin Atkin

2
@BenAtkin Xin lỗi, lỗi tự do. Tuy nhiên, cách đọc của tôi vẫn đúng. \nkhông liên quan gì đến JavaScript. Trên thực tế, không có gì ở đây liên quan đến JavaScript.
Chris Down

Tôi đang sử dụng nó với mục đích giải thích cho mọi người. Và nó dường như đã hoạt động. Cú pháp chuỗi shell không được hiểu rộng rãi. Nếu đúng như vậy, tại sao câu hỏi này lại được đặt ra? Tôi nên dùng gì để giải thích nó?
Benjamin Atkin

16

Có một cách dễ dàng hơn nhiều!

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

Điều này sẽ sử dụng ANSI-C Quoting để chèn ký tự dòng mới.

Không có đường ống, không có tệp dữ liệu. Xem thêm Gửi dòng mới với cURL .


Một mà phải là một câu trả lời được chấp nhận mặc dù sử dụng cú pháp Bash
odiszapc

Đây là điều duy nhất mà làm việc cho tôi ra khỏi tất cả các câu trả lời
Bob Kocisko

15

Giải pháp cho những người không muốn sử dụng tệp và không muốn sử dụng phép thuật thoát shell là:

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

Nhưng đây là dòng mới theo nghĩa đen trong tải dữ liệu bài đăng, và không phải trong các trường biểu mẫu.


Tôi khó hiểu điều này. Tôi hiểu đó @là để chỉ ra một tên tệp nhưng có một số ý nghĩa đặc biệt khi sử dụng @-không? Đang <<EOFlàm gì vậy?
Dennis T - Phục hồi Monica -

1
@-yêu cầu curl tiêu thụ đầu vào từ tiêu chuẩn trong và <<EOFlà chỉ báo kết thúc luồng cho bash. Sau đó, chúng tôi sử dụng từ ma thuật EOFtrong phần tải dữ liệu để nói với bash rằng chúng tôi đã ghi xong vào luồng.
Jammer

Ngoài ra, đây -là cách tiêu chuẩn trong GNU / Linux để chỉ định STDIN khi tên tệp được mong đợi. Nó không phổ biến, nhưng nó khá phổ biến.
Rich Remer

Bằng cách tham khảo sách hướng dẫn, chúng tôi thấy rằng nó chỉ nên - và không phải @ -
user3504575

8

Có vấn đề tương tự. Trong khi tải tệp csv từ Mac lên bộ nhớ đám mây, các dòng mới đã bị xóa. Sau khi tải xuống, toàn bộ tệp trông giống như một dòng duy nhất. Tôi đã thử thêm các ký tự EOL khác nhau '\ n' '\ r' '\ r \ n' nhưng không thành công. Sử dụng '--data-binary' thay vì '-d' đã giải quyết được vấn đề. Btw vấn đề này chỉ xảy ra từ Mac. '-d' hoạt động tốt khi thực hiện cuộc gọi từ máy CentOS. Điều này rất giống do ký tự dòng mới của Mac. Nhưng không cảm thấy muốn gỡ lỗi nữa.

Cảm ơn sự giúp đỡ của bạn.

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

VS

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

Cảm ơn rất nhiều ! Điều này không liên quan đến máy Mac của bạn: Tôi đã gặp sự cố chính xác trên Linux và việc sử dụng --data-binary @đã giải quyết được sự cố của tôi (gửi tệp .ics nhiều dòng tới máy chủ CalDAV).
M-Jack

7

(Tôi đã kết thúc ở đây với một câu hỏi hơi khác, vì vậy tôi sẽ đăng câu trả lời của mình vì nó có thể giúp ích cho những người khám phá trong tương lai)

Giải pháp của tôi áp dụng cho những người đang gửi dữ liệu kiểu biểu mẫu, tức là các cặp khóa / giá trị trong một chuỗi truy vấn. Sử dụng ngắt dòng được mã hóa %0A, giống như cách một không gian được mã hóa %20. Bạn có thể sử dụng http://meyerweb.com/eric/tools/dencoder/ để chuyển đổi các ký hiệu khác.

Vì vậy, nếu bạn muốn đặt khóa messagethành giá trị:

line one
another

bạn sẽ gửi

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

1
nhận xét nhỏ (có thể đánh máy) đối với ký tự ngắt dòng / ký tự trả về carraige, nó phải là% 0A chứ không phải% A0
Paul

3

Không phải là câu trả lời cho câu hỏi của bạn, nhưng tôi sẽ giải quyết vấn đề đó bằng cách tạo một tệp tạm thời chứa thông báo và ngắt dòng, đồng thời cung cấp cho tệp curl đó hoạt động trên:

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

Từ sách hướng dẫn :

Nếu bạn bắt đầu dữ liệu bằng ký tự @, phần còn lại phải là tên tệp để đọc dữ liệu từ đó, hoặc - nếu bạn muốn curl đọc dữ liệu từ stdin. Nội dung của tệp phải được mã hóa URL. Nhiều tệp cũng có thể được chỉ định. Do đó, việc đăng dữ liệu từ tệp có tên 'foobar' sẽ được thực hiện với --data @foobar.


Sử dụng các tệp tạm thời là một cách tiếp cận tiện dụng. Theo câu trả lời của Szocske, --data-binarylà một sự thay thế trung thực hơn -d, vì nó sẽ gửi dữ liệu nguyên văn.
William Denniss

7
-1; Sử dụng tệp tạm thời với -d @/path/to/temp/file.txtKHÔNG giải quyết được vấn đề ngắt dòng. --data-binaryhiện, xem ở trên.
Frank Olschewski

Nếu bạn thấy điều này vì bạn đang tự hỏi tại sao các lệnh curl của mình không hoạt động sau khi nâng cấp curl hoặc nâng cấp lên windows 10, hãy đảm bảo bạn thêm dấu ngoặc kép xung quanh tham chiếu tệp của mình. Ví dụ: curl -X PUT -d "@ message.txt" localhost: 8000 / hello Các tập lệnh xây dựng lại tìm kiếm đàn hồi của tôi đã ngừng hoạt động.
joezen777

3

Một cách rất dễ dàng, chỉ cần Shift-Enter trong bảng điều khiển để giải lao. Nhập nó vào cũng rất dễ đọc.

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

Server gets this: line1\nline2

Làm điều này để loại bỏ ngắt dòng:

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

Server gets this: line1 line2

-2

Tôi đang sử dụng Sendgrid với mã này (được sao chép bên dưới) ban đầu được tìm thấy tại đây https://sendgrid.com/docs/API_Reference/Web_API_v3/index.html

\n\nhoạt động trong Gmail, nhưng \nbị bỏ qua. Tôi đã cố gắng tăng gấp đôi lần trốn thoát và những gợi ý khác. Tôi cũng đã thử \r\nvà điều đó cũng không hoạt động trong Gmail. Lưu ý: Tôi không bận tâm đến việc kiểm tra các ứng dụng email khác, có thể đó là một vấn đề cụ thể của 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!"}]}'

Cuối cùng tôi đã từ bỏ tìm kiếm một giải pháp và chuyển sang text/plainđể text/htmlvà chỉ được sử dụng <br />thẻ.

Ai đó đã đề xuất rằng Sendgrid chuyển đổi văn bản rõ ràng sang HTML nếu bạn đã bật pixel theo dõi, điều này có ý nghĩa. Có thể các dòng mới đã bị phá hủy trong quá trình chuyển đổi từ bản rõ sang html. Tôi cho rằng khách hàng muốn có pixel theo dõi, vì vậy đã quyết định chuyển sang HTML.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.