cURL < - 機能

cURL < - 機能
$ cat file | curl -F 'sprunge=<-' http://sprunge.us

したがって、出力はechoPOSTパラメータとしてcURLに渡されます。これはcURLの特定の機能ですか?

答え1

-通常、標準入力を表すために使用され、<ファイルのリダイレクトを表すためによく使用されます。私はこれらの構文が初期のシェルから来たと信じています。これは、標準入力を受け取り、別の場所に送信またはリダイレクトすることを意味します。構文はほぼ自然です。

cURLを見る改訂履歴、この<構文は2000年半ばにcU​​RLに追加されました。この機能を追加したリビジョンはGitコミットとして使用できます5b7a5046e6

変更ログから

Torsten Foertsch <torsten.foertsch at gmx.net> brought a set of fixes for
the rfc1867 form posts. He introduced 'name=<file' which brings a means to
suuply very large text chunks read from the given file name. It differs from
'name=@file' in the way that this latter thing is marked in the uploaded
contents as a file upload, while the first is just text (as in a input or
textarea field). Torsten also corrected a bug that would happen if you used
%s or similar in a -F file name.

この機能のインスピレーションや由来についての言及はありません。

この@-構文は、私が見つけることができるソースコードの最も初期のバージョンであるcURLにあります。 1999年末第1次改正以後、

/* postfield data */
if('@' == *nextarg) {
  /* the data begins with a '@' letter, it means that a file name
     or - (stdin) follows */
  FILE *file;
  nextarg++; /* pass the @ */

cURLに固有のものかどうかを言うのは難しいです。構文は一般的で自然です。これに関連するcURL機能はcURLの基本機能です。そうであれば、cURLに似たツールがそれを何らかの形で実装する可能性が高くなります。


元の質問は

$ echo foo | curl -d 'sprunge=<-' http://sprunge.us

私の答えは次のとおりです。

私はこれがcURL機能だとは思わない。

$ # Terminal A
$ curl --version
curl 7.31.0 (x86_64-unknown-linux-gnu) libcurl/7.31.0 OpenSSL/1.0.1e zlib/1.2.8 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
$
$ echo foo | curl -d 'sprunge=<-' localhost:2222

$ # Terminal B
$ nc -l 2222
POST / HTTP/1.1
User-Agent: curl/7.31.0
Host: localhost:2222
Accept: */*
Content-Length: 7
Content-Type: application/x-www-form-urlencoded

sprunge=<-

cURLドキュメントにこの機能への言及がありません。しかし、同様の機能があります。

文字@でデータを開始する場合、残りはデータを読み取るファイル名でなければなりません。または - カールを使用してstdinからデータを読み取る場合は、次のようにします。ファイルの内容はURLでエンコードする必要があります。複数のファイルを指定することもできます。したがって、--data @ foobarを使用して、「foobar」というファイルのデータ公開を実行できます。

答え2

socatを使用したカールの監視

このコマンドに関する質問が更新されました。

$ cat file | curl -F 'sprunge=<-' http://sprunge.us

色々なことをしています。これにより、socat次のように端末で要求を監視できます。

$ socat - TCP4-LISTEN:2222,fork | grep -E 'Content-Disp|msg'

次に、2番目の端末でcurlコマンドを使用してデーモンに接続しますsocatcat fileサンプルファイルでは、次を使用します。

$ cat hello.txt
msg: hello curl

いつ私たちはcurl

$ cat ~/hello.txt | curl -Fblah=\<- localhost:2222

出力には次のものがありますsocat

Content-Disposition: form-data; name="blah"
msg: hello curl

文字列をaからblahaに変更すると、-次のようになります。

$ cat ~/hello.txt | curl -F-=\<- localhost:2222

結果:

Content-Disposition: form-data; name="-"

ご覧のとおり、最初の文字の後のパラメータは-F送信するフォームの名前です。 -F` のマニュアルページは、curl mentions that名前を付ける HTTP フォームを送信するために使用されます。

 -F, --form <name=content>
   (HTTP)  This  lets  curl emulate a filled-in form in which a user
   has pressed the submit button. This causes curl to POST data using
   the Content-Type  multipart/form-data  according  to  RFC  2388.
   This enables uploading of binary files etc. To force the 'content'
   part to be a file,  prefix  the  file  name with  an  @  sign.
   To just get the content part from a file, prefix the file
   name with the symbol <. The difference between @ and < is then
   that @ makes a file  get  attached  in  the  post as a file upload,
   while the < makes a text field and just get the contents for that
   text field from a file.

スイッチの残りの部分は-F-=STDIN入力をこのパラメータに接続します。<-。 STDINはを介して含まれますcat file |

引数の比較 - ~'-F-=<-'-F-=\<-

これら2つの記号は同じです。今回も追加の詳細レベルを使用して、何が起こっているかを確認できます。

$ set -x; cat ~/hello.txt | curl '-F-=<-' localhost:2222; set +x
...
+ cat /Users/smingolelli/hello.txt
+ curl '-F-=<-' localhost:2222

別の方法は次のとおりです。

$ set -x; cat ~/hello.txt | curl -F-=\<- localhost:2222; set +x
...
+ cat /Users/smingolelli/hello.txt
+ curl '-F-=<-' localhost:2222

人々は入力中に余分な文字を節約するので、最初の方法を好む。しかし、curl観点から見ると、彼らは同じです。これは、シェルで処理されるのではなく表示されるように-F-=\<-リダイレクトをエスケープするだけです。curl


元の質問

元の質問はこれに関するものでした。

$ echo foo | curl -d 'sprunge=<-' http://sprunge.us

これに対する私の答えは次のとおりです。

カールスイッチを使用すると、-dマニュアルページのPOSTを意味しますcurl

-d/--data <data>
     (HTTP) Sends the specified data in a POST request to the HTTP server, 
     in the same way that a browser does  when  a user has filled in an 
     HTML form and presses the submit button. This will cause curl to pass 
     the data to the server using the content-type 
     application/x-www-form-urlencoded.  Compare to -F/--form.

関連情報