$ 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'
이제 두 번째 터미널에서 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-=\<-
이 두 기호는 동일합니다. 이번에도 추가 세부 정보 수준을 사용하여 무슨 일이 일어나고 있는지 확인할 수 있습니다.
$ 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.