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


30

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

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

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

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

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


ファイルにログを記録していない場合、どこにログを記録しますか?
slm

@slm、あなたは誤解していると思う。クライアント側の残りの呼び出しをプレーンテキストのログファイルに記録しています(逐語的に同等のcurlコマンドとして)。ただし、ログに記録するバイナリcurlコマンドごとにランダムファイルを参照する必要はありません。誰かがそのテキストを端末にコピーして実行し、コールを再現できるように、curlコマンドのテキスト全体を完全に自己完結させる必要があります。
カークウォル

回答:


45

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

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

@-伝えcurlSTDINからプルします。

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

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

ただし、これでもバイナリデータをcurlコマンドのテキストの一部にすることはできません。それは不可能ですか?
カークウォル

あなたが求めていることは実行可能とは思えません。curlコマンドへのデータは、curlにパイプするか、@ <filename>機能を使用して取り込むことができます。私の知る限り、他の方法はありません。
slm

1
実際、あなたの答えは完璧です-あなたの例では、代わりにバイナリを使用する必要があります。:)つまり 、16進数の生のバイナリデータは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 | md5summd5sum 1.jpg。どちらも同じ値を返しました。
dimitarvp

0

理由はわかりませんが、slmが示唆した正確なコマンドラインは機能しませんでした。わずかな変更を加えて、以下が機能しました:

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

1
その理由は、SFTPがHTTPとはまったく異なるプロトコルを備えたまったく異なるプロトコルであり、manページとヘルプメッセージの両方が--data-binaryがHTTP(およびHTTPS)にのみ適用されるためです。
-dave_thompson_085

それは理にかなっている。私はいくつかのオンラインソースを組み合わせてそれを機能させていたので、HTTP固有の質問の一部を見逃しました。他の誰かがそれを必要とする場合のために、ここに私の答えを残します。
リチャードニーナバー

0

に追加 この答えに、echoコマンドはデフォルトで出力に改行を追加します。これにより、\nバイナリデータの末尾にa が追加されるため、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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.