( 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://en.wikipedia.org/wiki/curl
https://www.thegeekstuff.com/2012/04/curl-examples/
댓글 없음:
댓글 쓰기