ファイル名を渡さずにcurlを使用してバイナリデータをポストすることは可能ですか?たとえば、-data-binaryを介してバイナリを使用してフォームを投稿できます。
curl -X POST --data-binary @myfile.bin http://foo.com
ただし、これにはファイルが存在する必要があります。リクエストを再現するために、curlコマンドのテキストとしてHTTP呼び出し(サービスの休止など)を記録できることを望んでいました。 (これは、たとえば、これらのサービスのデバッグを大幅に支援します)
ただし、ファイルを参照するcurlコマンドをログに記録しても役に立たないため、おそらくbase64でエンコードされた生のバイナリデータを実際にログに記録でき、しかもログされたcurlコマンドをコピーして貼り付けて実行できることを望んでいました。
では、ファイルを参照せずにcurlを使用してバイナリデータをポストすることは可能ですか?もしそうなら、それはどのように機能しますか?例はどのようになりますか?
次のように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
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
に渡すバイトと同じになります。
理由はわかりませんが、slmが提案した正確なコマンドラインではうまくいきませんでした。わずかな変更で、以下が機能しました:
echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt