$ cat file | curl -F 'sprunge=<-' http://sprunge.us
したがって、出力はecho
POSTパラメータとしてcURLに渡されます。これはcURLの特定の機能ですか?
答え1
-
通常、標準入力を表すために使用され、<
ファイルのリダイレクトを表すためによく使用されます。私はこれらの構文が初期のシェルから来たと信じています。これは、標準入力を受け取り、別の場所に送信またはリダイレクトすることを意味します。構文はほぼ自然です。
cURLを見る改訂履歴、この<
構文は2000年半ばにcURLに追加されました。この機能を追加したリビジョンは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
コマンドを使用してデーモンに接続しますsocat
。cat 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からblah
aに変更すると、-
次のようになります。
$ 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.