Передача двоичных данных в curl без использования @file

31

Можно ли использовать curl и публиковать двоичные данные без передачи имени файла? Например, вы можете опубликовать форму с помощью двоичного файла через --data-binary:

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

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

Однако регистрация команд скручивания, которые ссылаются на файл, не будет полезной, поэтому я надеялся, что смогу фактически записать необработанные двоичные данные, предположительно закодированные в base64, и все же позволить вам скопировать и вставить команду записанной скручивания и выполнить ее.

Итак, возможно ли использовать curl и публиковать двоичные данные без ссылки на файл? Если так, как это будет работать? Как будет выглядеть пример?

Кирк Волл
источник
Если вы не записываете его в файл, то куда вы его записываете?
SLM
@ Я думаю, ты неправильно понял. Я записываю мои остальные вызовы на стороне клиента в файл журнала в виде простого текста (как дословная команда curl). Однако я не хочу ссылаться на какой-нибудь случайный файл для каждой двоичной команды curl, которую я регистрирую. Я хочу, чтобы весь текст команды curl был полностью автономным, чтобы кто-то мог скопировать этот текст в терминал и запустить его для воспроизведения вызова.
Кирк Волл

Ответы:

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
SLM
источник
Но это по-прежнему не позволяет двоичным данным быть частью текста команды curl. Так это не возможно?
Кирк Уолл
То, что вы просите, не представляется возможным. Данные для команды curl могут быть переданы в curl или извлечены через средство @ <filename>. Насколько мне известно, нет никакого другого метода.
slm
1
На самом деле, ваш ответ идеален - ваш пример должен просто использовать двоичный код. :) То есть echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com где \x03\xF1сырые двоичные данные в шестнадцатеричном формате, что в значительной степени именно то, что я хочу.
Кирк Уолл
Отлично. Я не следил за тобой полностью. Итак, вы просто хотели передать двоичные данные в 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, с очень разными возможностями, и как справочная страница, так и сообщение справки говорят --data-binary применимы только к HTTP (и HTTPS).
dave_thompson_085
В этом есть смысл. Я объединял несколько источников в Интернете, чтобы заставить это работать, поэтому я пропустил ту часть вопроса, которая сделала его специфичным для HTTP. Я оставлю здесь свой ответ на случай, если кому-то еще это понадобится.
Ричард Нинабер
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

Таким образом, никакая новая строка не будет добавлена ​​к входу curl, и байты, передаваемые в curl, будут именно теми, на которые вы переходите echo.

robg
источник