Truyền dữ liệu nhị phân để cuộn tròn mà không sử dụng @file


30

Có thể sử dụng curl và đăng dữ liệu nhị phân mà không cần nhập tên tập tin? Ví dụ: bạn có thể đăng một biểu mẫu bằng cách sử dụng nhị phân qua --data-binary:

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

Tuy nhiên, điều này đòi hỏi một tập tin tồn tại. Tôi đã hy vọng có thể ghi nhật ký các cuộc gọi HTTP (chẳng hạn như các dịch vụ nghỉ ngơi) dưới dạng văn bản của lệnh curl để tạo lại yêu cầu. (điều này hỗ trợ rất nhiều cho việc gỡ lỗi các dịch vụ này chẳng hạn)

Tuy nhiên, việc ghi nhật ký các lệnh curl tham chiếu tệp sẽ không hữu ích, vì vậy tôi hy vọng tôi thực sự có thể ghi dữ liệu nhị phân thô, có lẽ được mã hóa base64, nhưng vẫn cho phép bạn sao chép và dán lệnh curl đã ghi và thực thi.

Vì vậy, có thể sử dụng curl và đăng dữ liệu nhị phân mà không cần tham chiếu một tập tin? Nếu vậy, làm thế nào sẽ làm việc? Một ví dụ sẽ trông như thế nào?


Nếu bạn không đăng nhập vào một tệp thì bạn đang đăng nhập vào đâu?
slm

@slm, tôi nghĩ bạn hiểu nhầm. Tôi đang ghi nhật ký các cuộc gọi nghỉ ngơi phía máy khách của tôi vào một tệp nhật ký bằng văn bản thuần túy (như lệnh curl tương đương nguyên văn). Tuy nhiên, tôi không muốn phải tham khảo một số tệp ngẫu nhiên cho mỗi lệnh curl nhị phân mà tôi đăng nhập. Tôi muốn toàn bộ văn bản của lệnh curl hoàn toàn khép kín để ai đó có thể sao chép văn bản đó vào một thiết bị đầu cuối và chạy nó để tái tạo cuộc gọi.
Kirk Woll

Câu trả lời:


45

Bạn có thể truyền dữ liệu vào curl thông qua STDIN như vậy:

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

Các @-kể curlđể kéo từ STDIN.

Để đường ống dữ liệu nhị phân để cuộn tròn (ví dụ):

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

Nhưng điều này vẫn không cho phép dữ liệu nhị phân là một phần của văn bản của lệnh curl. Vì vậy, điều đó là không thể?
Kirk Woll

Những gì bạn đang yêu cầu không có vẻ khả thi. Dữ liệu cho lệnh curl có thể được chuyển thành curl hoặc được kéo vào thông qua tiện ích @ <filename>. Theo hiểu biết của tôi, không có phương pháp nào khác.
slm

1
Trên thực tế, câu trả lời của bạn là hoàn hảo - ví dụ của bạn chỉ nên sử dụng nhị phân thay thế. :) tức là echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com đâu \x03\xF1là dữ liệu nhị phân thô dưới dạng thập lục phân, chính xác là những gì tôi muốn.
Kirk Woll

Tuyệt quá. Tôi đã không theo dõi bạn hoàn toàn. Vì vậy, bạn không muốn chuyển dữ liệu nhị phân thành curl, tôi nghĩ rằng bạn đang yêu cầu một cái gì đó khác. Vui mừng nó đã làm việc cho bạn.
slm

2
Tôi đã thử điều này : cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Làm việc như người ở. Để xác thực, tôi cũng đã thử: cat 1.jpg | md5summd5sum 1.jpg. Cả hai đều trả lại cùng một giá trị.
dimitarvp

0

Không chắc tại sao, nhưng dòng lệnh chính xác mà slm đề xuất không hoạt động với tôi. Với một sửa đổi nhỏ, sau đây đã làm việc:

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

1
Lý do tại sao SFTP là một giao thức hoàn toàn khác với HTTP với các khả năng rất khác nhau và cả trang man và thông báo trợ giúp đều nói --data-binary chỉ áp dụng cho HTTP (và HTTPS).
dave_thndry_085

Điều đó có ý nghĩa. Tôi đã kết hợp một số nguồn trực tuyến để làm cho nó hoạt động vì vậy tôi đã bỏ lỡ một phần của câu hỏi làm cho nó cụ thể HTTP. Tôi sẽ để lại câu trả lời của mình ở đây trong trường hợp người khác cần nó.
Richard Nienaber

0

Thêm vào câu trả lời này , echolệnh sẽ thêm một dòng mới vào đầu ra của nó theo mặc định. Điều này thêm một \nphần cuối của dữ liệu nhị phân của bạn, do đó curl cũng sẽ nhận được ký tự đó làm đầu vào.

Để tránh điều đó, bạn có thể sử dụng printflệnh hoặc công -ntắc như vậy:

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

hoặc là

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

Bằng cách này, không có dòng mới nào sẽ được thêm vào đầu vào cuộn tròn và các byte được cung cấp để cuộn tròn sẽ chính xác là những dòng bạn chuyển đến echo.

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.