web-dev-qa-db-ja.com

@fileを使用せずにバイナリデータをcurlに渡す

ファイル名を渡さずにcurlを使用してバイナリデータをポストすることは可能ですか?たとえば、-data-binaryを介してバイナリを使用してフォームを投稿できます。

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

ただし、これにはファイルが存在する必要があります。リクエストを再現するために、curlコマンドのテキストとしてHTTP呼び出し(サービスの休止など)を記録できることを望んでいました。 (これは、たとえば、これらのサービスのデバッグを大幅に支援します)

ただし、ファイルを参照するcurlコマンドをログに記録しても役に立たないため、おそらくbase64でエンコードされた生のバイナリデータを実際にログに記録でき、しかもログされたcurlコマンドをコピーして貼り付けて実行できることを望んでいました。

では、ファイルを参照せずにcurlを使用してバイナリデータをポストすることは可能ですか?もしそうなら、それはどのように機能しますか?例はどのようになりますか?

32
Kirk Woll

次のようにSTDINを介してデータをcurlに渡すことができます。

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

@-は、STDINからプルするようにcurlに指示します。

バイナリデータをcurlにパイプするには(たとえば):

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

this 回答に追加すると、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に渡すバイトと同じになります。

0
robg

理由はわかりませんが、slmが提案した正確なコマンドラインではうまくいきませんでした。わずかな変更で、以下が機能しました:

echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt
0