KOROMOON

착한 사마리아인이 되고 싶습니다.

12/28/2021

curl 명령어


( 1 ) curl 설명



curl 은 URL 로 데이터를 전송하기 위한 명령줄 도구 및 라이브러리임.

1996년 Client URL 명명식으로 처음 출시되었으며 다양한 프로토콜을 지원함.

curl 홈페이지 : https://curl.se/




( 2 ) curl 옵션


아래 curl 명령어 옵션은 7.79.1 버전에서 확인한 옵션임.


┌──(kali㉿kali)-[~]

└─$ curl -h

사용법: curl [options...] <url>

 -d, --data <data>   HTTP POST 데이터

 -f, --fail          HTTP 오류 시 자동으로 실패 (출력 없음)

 -h, --help <category>      명령어에 대한 도움말 보기

 -i, --include       출력에 프로토콜 응답 헤더 포함

 -o, --output <file> stdout 대신 파일에 쓰기

 -O, --remote-name   원격 파일로 명명된 파일에 출력 쓰기

 -s, --silent        무음 모드 (Silent mode)

 -T, --upload-file <file>    로컬 FILE 을 대상으로 전송

 -u, --user <user:password>  서버 사용자 및 비밀번호

 -A, --user-agent <name>     서버에 User-Agent <name> 보내기

 -v, --verbose       조작을 더 수다스럽게 만듬 (Make the operation more talkative)

 -V, --version       버전 번호를 표시하고 종료


이것은 전체 도움말이 아니며 이 메뉴는 범주로 구분됨.

모든 범주에 대한 개요를 보려면 "--help category"를 사용하십시오.

모든 옵션에 대해 수동 또는 "--help all"을 사용하십시오.


┌──(kali㉿kali)-[~]

└─$ curl -V

curl 7.79.1 (x86_64-pc-linux-gnu) libcurl/7.79.1 OpenSSL/1.1.1l zlib/1.2.11 brotli/1.0.9 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.0) libssh2/1.10.0 nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.4.59

Release-Date: 2021-09-22

Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp

Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets




( 3 ) curl 사용예




01. 단일 파일 다운로드


아래 명령어는 URL 의 내용을 가져와 STDOUT(즉, 터미널)에 표시함.

$ curl http://www.centos.org


출력을 파일에 저장하려면 아래와 같이 리다이렉션하며 몇 가지 추가 다운로드 통계 정보가 표시됨.

$ curl http://www.centos.org > centos-org.html

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100 27329    0 27329    0     0   104k      0 --:--:-- --:--:-- --:--:--  167k




02. curl 출력을 파일에 저장하기


-o/-O 옵션을 사용하여 curl 명령어의 결과를 파일에 저장할 수 있음.


-o (소문자) 결과는 명령줄에 제공된 파일 이름에 저장됨.

-O (대문자) URL 의 파일 이름이 사용되며 결과를 저장하기 위한 파일 이름으로 사용됨.


$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html


위 gettext.html 페이지가 mygettext.html 이라는 파일에 저장됨.

또한, -o 옵션과 함께 curl 명령어를 실행하면 다음과 같이 다운로드에 대한 진행률 표시기가 표시됨.


  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

 66 1215k   66  805k    0     0  33060      0  0:00:37  0:00:24  0:00:13 45900

100 1215k  100 1215k    0     0  39474      0  0:00:31  0:00:31 --:--:-- 68987


-O 옵션을 사용하면 로컬 시스템에 gettext.html 이라는 파일 자체에 내용이 저장됨.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html


참고로 curl 이 데이터를 터미널에 써야 할 때 인쇄의 혼란을 피하기 위해 Progress Meter 를 비활성화함.

'>'|'-o'|'-O' 옵션을 사용하여 결과를 파일로 이동할 수 있음.




03. 한 번에 여러 파일 가져오기


명령줄에 URL 을 지정하여 한 번에 여러 파일을 다운로드할 수 있음.


기본 사용법 : 

$ curl -O URL1 -O URL2


아래 명령어는 index.html 과 gettext.html 을 모두 다운로드하여 현재 디렉토리에 같은 이름으로 저장함.

$ curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html


위와 같이 동일한 서버에서 여러 파일을 다운로드할 때 curl 은 연결을 다시 사용하려고 시도함.




04. -L 옵션을 사용하여 HTTP 위치 헤더를 따르기


기본적으로 curl 은 HTTP 위치 헤러를 따르지 않음.

리다이렉션이라고도 함.

요청된 웹 페이지가 다른 위치로 이동하면 HTTP 위치 헤더가 응답으로 전송되고 실제 웹 페이지가 있는 위치가 포함됨.


예를 들어, 누군가가 한국에서 브라우저에 google.com 을 입력하면 자동으로 google.co.kr 로 리다이렉션됨.

이는 아래와 같이 HTTP 위치 헤더를 기반으로 수행됨.

$ curl http://www.google.com

 

<TITLE>302 Moved</TITLE>

<H1>302 Moved</H1>

The document has moved

<A HREF="http://www.google.co.kr/">here</A>


위의 출력은 요청된 문서가 http://www.google.co.kr 로 이동되었음을 나타냄.


아래와 같이 -L 옵션을 사용하여 리다이렉션을 따르도록 curl 을 사용할 수 있음.

이제 google.co.kr 의 html 소스 코드를 다운로드함.

$ curl -L http://www.google.com




05. 이전 다운로드 지속/재개


-C 옵션을 사용하면 어떤 이유로 이미 중단된 다운로드를 계속할 수 있음.

대용량 파일을 다운로드할 때나 다운로드가 중단될 때 유용함.


-C 옵션을 사용하면 curl 은 다운로드 재개를 시작할 위치를 찾음.

오프셋 '-C <offset>' 로 사용할 수 있어 지정된 오프셋 바이트부터 다운로드할 수 있음.


curl 을 사용하여 대용량 다운로드를 시작하고 Ctrl -C 를 눌러 다운로드 중 중지함.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html

##############             20.1%


참고로 # 문자는 진행률 표시기 대신 진행률 표시줄을 표시하는데 사용됨.

위의 다운로드가 20.1% 에서 중지됨.

curl -C - 명령어를 사용하여 이전에 중단된 위치에서 다운로드를 계속할 수 있음.

이제 다운로드는 20.1% 에서 계속됨.

curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html

###############            21.1%




06. 데이터 전송 속도 제한


--limit-rate 옵션을 사용하여 데이터가 전송되는 양을 제한할 수 있음.

최대 전송 속도를 인수로 지정할 수 있음.


$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html


위의 명령어는 데이터 전송을 초당 1000 바이트로 제한함.

curl 은 짧은 시간 동안 더 높은 전송 속도를 사용할 수 있음.

그러나 평균적으로는 약 초당 1000 바이트에 이를 것임.


다음은 위의 명령어에 대한 진행률 측정기임.

현재 속도가 1000 바이트에 가깝다는 것을 알 수 있음.

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                               Dload  Upload   Total   Spent    Left  Speed

1 1215k    1 13601    0     0    957      0  0:21:40  0:00:14  0:21:26   999

1 1215k    1 14601    0     0    960      0  0:21:36  0:00:15  0:21:21   999

1 1215k    1 15601    0     0    962      0  0:21:34  0:00:16  0:21:18   999




07. 주어진 시간 이전/이후에 수정된 파일만 다운로드


curl 에서 -z 옵션을 사용하여 특정 시간 이후에 수정된 파일을 가져올 수 있음.

이것은 FTP 및 HTTP 모두에서 작동함.


$ curl -z 21-Dec-11 http://www.example.com/yy.html


위의 명령어는 주어진 날짜와 시간보다 늦게 수정된 경우에만 yy.hmtl 을 다운로드함.


$ curl -z -21-Dec-11 http://www.example.com/yy.html


위의 명령어는 yy.html 이 주어진 날짜와 시간보다 이전에 수정된 경우 다운로드함.




08. curl 에서 HTTP 인증 전달


간혹 웹사이트는 콘텐츠를 보기 위해 사용자 이름과 비밀번호를 요구함.

-u 옵션을 사용하여 아래와 같이 curl 에서 웹서버로 자격 증명을 전달할 수 있음.

$ curl -u username:password URL


참고로 curl 은 기본 HTTP 인증을 사용함.




09. FTP 서버에서 파일 다운로드


curl 을 사용하여 FTP 서버에서 파일을 다운로드할 수도 있음.

지정된 FTP 경로가 디렉토리인 경우 기본적으로 특정 디렉토리 아래에 파일이 나열됨.


$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php


위의 명령어는 ftp 서버에서 xss.php 파일을 다운로드하여 로컬 디렉토리에 저장함.


$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/


여기에서 주어진 URL 은 디렉토리를 나타냄.

따라서 curl 은 주어진 URL 아래의 모든 파일과 디렉토리를 나열함.




10. 범위를 사용하여 나열/다운로드


curl 은 URL 에 제공되는 범위을 지원함.

범위가 지정되면 범위 내에서 일치하는 파일이 다운로드됨.

FTP 미러 사이트에서 패키지를 다운로드하는 데 도움이 됨.


$ curl   ftp://ftp.uk.debian.org/debian/pool/main/[a-z]/


위의 명령어는 터미널의 az 범위에 있는 모든 패키지를 나열함.




11. FTP 서버에 파일 업로드


curl 은 -T 옵션을 사용하여 FTP 서버에 파일을 업로드하는 데 사용할 수 있음.


$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com


위의 명령은 myfile.txt 이라는 파일을 FTP 서버에 업로드함.

범위 작업을 사용하여 동시에 여러 파일을 업로드할 수도 있음.


$ curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com


선택적으로 "." 을 사용할 수 있음.

STDIN 에서 입력을 받아 리모콘으로 전송함.


$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt


위의 명령어는 표준 입력에서 사용자의 입력을 받아 myfile_1.txt 이라는 이름으로 ftp 서버에 내용을 저장함.


각 URL 에 대해 하나의 -T 옵션을 제공할 수 있으며 어디에 무엇을 업로드할 지도 지정함.




12. 상세 및 추적 옵션을 사용한 추가 정보


-v 옵션을 사용하여 무슨 일이 일어나고 있는지 알 수 있음.

-v 옵션은 상세 모드를 활성화하고 세부 정보를 인쇄함.


curl -v http://google.co.kr


위 명령어는 다음을 출력함.


* About to connect() to www.google.co.kr port 80 (#0)

*   Trying 216.58.220.99... connected

* Connected to www.google.co.kr (216.58.220.99) port 80 (#0)

> GET / HTTP/1.1

> User-Agent: curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6

> Host: www.google.co.kr

> Accept: */*

> 

* HTTP 1.0, assume close after body

< HTTP/1.0 200 OK

< Date: Tue, 10 Apr 2012 11:18:39 GMT

< Expires: -1

< Cache-Control: private, max-age=0

< Content-Type: text/html; charset=ISO-8859-1

< Set-Cookie: PREF=ID=7c497a6b15cc092d:FF=0:TM=1334056719:LM=1334056719:S=UORpBwxFmTRkbXLj; expires=Thu, 10-Apr-2014 11:18:39 GMT; path=/; domain=.google.co.kr

.

.


더 자세한 정보를 필요한 경우 --trace 옵션을 사용할 수 있음.

이 --trace 옵션은 주어진 파일에 대한 모든 수신/발신 데이터의 전체 추적 덤프를 활성화함.


=> Send header, 169 bytes (0xa9)

0000: 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1..

0010: 55 73 65 72 2d 41 67 65 6e 74 3a 20 63 75 72 6c User-Agent: curl

..

0060: 2e 32 2e 33 2e 34 20 6c 69 62 69 64 6e 2f 31 2e .2.3.4 libidn/1.

0070: 31 35 20 6c 69 62 73 73 68 32 2f 31 2e 32 2e 36 15 libssh2/1.2.6

0080: 0d 0a 48 6f 73 74 3a 20 77 77 77 2e 67 6f 6f 67 ..Host: www.goog

0090: 6c 65 2e 63 6f 2e 69 6e 0d 0a 41 63 63 65 70 74 le.co.kr..Accept

00a0: 3a 20 2a 2f 2a 0d 0a 0d 0a                      : */*....

== Info: HTTP 1.0, assume close after body

<= Recv header, 17 bytes (0x11)

0000: 48 54 54 50 2f 31 2e 30 20 32 30 30 20 4f 4b 0d HTTP/1.0 200 OK.

0010: 0a


이 상세 및 추적 옵션은 어떤 이유로 인해 curl 이 실패하고 원인 파악할 때 유용함.




13. DICT 프로토콜을 사용하여 단어의 정의 가져오기


curl 을 사용하여 DICT 프로토콜의 도움으로 단어에 대한 정의를 얻을 수 있음.

단, 사전 서버 URL 을 전달해야 함.


$ curl dict://dict.org/d:bash


위의 명령어는 다음과 같이 bash 의미를 나열함.


151 "Bash" gcide "The Collaborative International Dictionary of English v.0.48"

Bash \Bash\, v. t. [imp. & p. p. {Bashed}; p. pr. & vb. n.

   {Bashing}.] [Perh. of imitative origin; or cf. Dan. baske to

   strike, bask a blow, Sw. basa to beat, bas a beating.]

   To strike heavily; to beat; to crush. [Prov. Eng. & Scot.]

   --Hall Caine.

   [1913 Webster]

 

         Bash her open with a rock.               --Kipling.

   [Webster 1913 Suppl.]

.

151 "Bash" gcide "The Collaborative International Dictionary of English v.0.48"

Bash \Bash\, n.

   1. a forceful blow, especially one that does damage to its

      target.

      [PJC]

.

.


많은 사전이 있으며 우리가 사용하는 모든 사전을 나열할 수 있음.


$ curl dict://dict.org/show:db

 

jargon "The Jargon File (version 4.4.7, 29 Dec 2003)"

foldoc "The Free On-line Dictionary of Computing (26 July 2010)"

easton "Easton's 1897 Bible Dictionary"

hitchcock "Hitchcock's Bible Names Dictionary (late 1800's)"

bouvier "Bouvier's Law Dictionary, Revised 6th Ed (1856)"


이제 컴퓨터에서 사용되는 bash 의 실제 의미를 찾기 위해 다음과 같이 "foldoc" 사전에서 bash 를 검색할 수 있음.


$ curl dict://dict.org/d:bash:foldoc


결과는 아래와 같음.


bash

 

   Bourne Again SHell.  {GNU}'s {command interpreter} for {Unix}.

   Bash is a {Posix}-compatible {shell} with full {Bourne shell}

   syntax, and some {C shell} commands built in.  The Bourne

   Again Shell supports {Emacs}-style command-line editing, job

   control, functions, and on-line help.  Written by Brian Fox of

   {UCSB}.


DICT에 대한 자세한 내용은 RFC2229 를 참조하십시오.




14. 프록시를 사용하여 파일 다운로드


-x 옵션을 사용하여 특정 작업을 수행하기 위해 프록시를 사용하도록 curl 을 지정할 수 있음.

단, 프록시의 호스트와 포트를 지정해야 함.


$ curl -x proxysever.test.com:3128 http://google.co.kr




15. SMTP 프로토콜을 사용하여 메일 보내기


curl 을 사용하여 SMTP 프로토콜를 이용한 메일을 보낼 수도 있음.

아래와 같이 발신자 주소, 수신자 주소 메일서버 IP 주소를 지정해야 함.

$ curl --mail-from blah@test.com --mail-rcpt foo@test.com smtp://mailserver.com


위의 명령이 입력되면 사용자가 메일에 데이터를 제공하기를 기다림.

메시지를 작성한 후 마지막 줄에 마침표(.)를 입력해야 즉시 이메일이 전송됨.


Subject: Testing

This is a test mail

.




참고 사이트 : 

https://curl.se/

https://en.wikipedia.org/wiki/curl

https://www.thegeekstuff.com/2012/04/curl-examples/


댓글 없음:

댓글 쓰기