Передача бінарних даних для згортання без використання @file


31

Чи можливо використовувати згортання та розміщення бінарних даних, не передаючи ім'я файлу? Наприклад, ви можете опублікувати форму за допомогою двійкової через --data-binary:

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

Однак для цього потрібен файл. Я сподівався на можливість записувати HTTP-дзвінки (наприклад, до послуг відпочинку) як текст команди curl для відтворення запиту. (це значно допомагає налагодженню цих служб, наприклад)

Однак реєстрація команд curl, що посилаються на файл, не була б корисною, тому я сподівався, що я можу насправді записати необроблені бінарні дані, імовірно, кодовані base64, і все ж дозволяти вам скопіювати та вставити записану команду curl та виконати її.

Отже, чи можна використовувати згортання та розміщення бінарних даних без посилання на файл? Якщо так, то як би це працювало? Як би виглядав приклад?


Якщо ви не записуєте його до файлу, то куди ви це входите?
slm

@slm, я думаю, ти неправильно розумієш. Я реєструю свої дзвінки на стороні клієнта до файлу журналу у простому тексті (як дослівна еквівалентна команда curl). Однак мені не хочеться посилатися на якийсь випадковий файл для кожної бінарної команди curl, яку я реєструю. Я хочу, щоб весь текст команди curl був повністю автономним, щоб хтось міг скопіювати цей текст у термінал і запустити його для відтворення виклику.
Кірк Волл

Відповіді:


45

Ви можете передати дані в curl через STDIN так:

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

@-Каже curlтягнути в з STDIN.

Для передачі бінарних даних для згортання (наприклад):

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

Але це все ще не дозволяє двійкові дані бути частиною тексту команди curl. Так це не можливо?
Кірк Волл

Те, що ви просите, не здається можливим. Дані в команду curl можна або перенести в curl, або перетягнути через об'єкт @ <filename>. Наскільки мені відомо, не існує жодного іншого методу.
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

Не знаю чому, але точний командний рядок, який запропонував slm, не працював для мене. З невеликою модифікацією працювало наступне:

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

1
Причина полягає в тому, що SFTP - це зовсім інший протокол від HTTP з дуже різними можливостями, і обидві сторінки та довідкове повідомлення кажуть --data-binary застосовується лише до HTTP (і HTTPS).
dave_thompson_085

Що має сенс. Я поєднував декілька Інтернет-джерел, щоб це працювало, тому я пропустив частину питання, що зробило його HTTP специфічним. Я залишу свою відповідь тут у випадку, якщо комусь це потрібно.
Річард Нієнабер

0

Додавши до цієї відповіді, echoкоманда додає до виводу новий рядок за замовчуванням. Це додає a \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

Таким чином, новий вхідний рядок не буде доданий до вводу curl, і байти, що подаються для згортання, будуть саме тими, до яких ви переходите echo.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.