cURL <- 기능

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

따라서 출력은 echoPOST 매개변수로 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에서 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-=\<-

이 두 기호는 동일합니다. 이번에도 추가 세부 정보 수준을 사용하여 무슨 일이 일어나고 있는지 확인할 수 있습니다.

$ 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.

관련 정보