목차
웹 서버에 대한 배치작업이 필요한 경우가 있다. 이런 작업에 웹 브라우저를 사용할 수 없는 노릇이니 CLI 도구를 사용해야 한다. curl은 가장 널리 사용하는 인터넷 데이터 전송을 위한 도구다.
# curl --version
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
$ curl -O http://yourdomain.com/yourfile.tar.gz # yourfile.tar.gz 으로 저장된다.
$ curl -o newfile.tar.gz http://yourdomain.com/yourfile.tar.gz # newfile.tar.gz 으로 저장된다.
-C 옵션을 이용해서 이어받기를 할 수 있다. 네트워크 문제 등으로 다운로드가 끊겼을 때 유용하게 사용 할 수 있다. -C 다음에
-를 주면 된다.
# 중간에 Ctrl+C로 연결을 끊었다.
$ curl -O http://mirror.kakao.com/ubuntu-releases/18.10/ubuntu-18.10-desktop-amd64.iso
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
1 1906M 1 26.2M 0 0 22.1M 0 0:01:26 0:00:01 0:01:25 22.1M^C
# 이어 받기 하는 걸 확인 할 수 있다.
$ curl -C - -O http://mirror.kakao.com/ubuntu-releases/18.10/ubuntu-18.10-desktop-amd64.iso
** Resuming transfer from byte position 46292992
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
4 1862M 4 81.2M 0 0 30.4M 0 0:01:01 0:00:02 0:00:59 30.4M
두 개 이상의 파일을 다운로드 할 수 있다.
$ curl -O http://yoursite.com/info.html -O http://mysite.com/about.html
# cat listurls.txt
https://www.joinc.co.kr/w/FrontPage
https://www.joinc.co.kr/w/man/1/at
https://www.joinc.co.kr/w/man/12/Kafka/QuickStart
# xargs -n 1 curl -O < listurls.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 25110 0 25110 0 0 415k 0 --:--:-- --:--:-- --:--:-- 415k
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 18986 0 18986 0 0 240k 0 --:--:-- --:--:-- --:--:-- 240k
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 32524 0 32524 0 0 365k 0 --:--:-- --:--:-- --:--:-- 365k
FrontPage, at, QuickStart 3개의 파일을 확인 할 수 있다.
# ls FrontPage at QuickStart -al
-rw-rw-r-- 1 yundream yundream 25110 6월 10 11:57 FrontPage
-rw-rw-r-- 1 yundream yundream 32524 6월 10 11:57 QuickStart
-rw-rw-r-- 1 yundream yundream 18986 6월 10 11:57 at
100KB/s로 다운로드 속도를 제한해보자.
$ curl --limit-rate 100K http://yourdomain.com/yourfile.tar.gz -O
HTTP Basic Authentication
HTTP Basic Authentication 인증을 수행 할 수 있다. Basic Authentication은 아이디/패스워드 기반의 간단한 인증 수단을 제공한다.
# curl -U yundream:password -x http://localhost:3000
전송 헤더 정보는 아래와 같다.
GET / HTTP/1.1
Host: localhost:3000
Authorization: Basic eXVuZHJlYW06cGFzc3dvcmQ=
User-Agent: curl/7.58.0
Accept: */*
아이디/패스워드는 암호화하지는 않고 단지 base64 인코딩만 수행한다.
verbose와 trace, --trace-ascii를 이용해서 HTTP 데이터 통신 과정에 대한 상세정보를 얻을 수 있다.
verbose로 불충분하다면 trace-ascii를 사용하자.
# curl --trace-ascii debug.dump http://www.test.co.kr/testpage
디버깅 정보는 debug.dump에 저장된다. 로컬 pc에 간단한 http 서버를 올려서 테스트를 진행했다.
# curl -XPOST http://localhost:8081 -d "Hi ?" --trace-ascii debug.dump
# cat debug.dump
== Info: Rebuilt URL to: http://localhost:8081/
== Info: Trying 127.0.0.1...
== Info: TCP_NODELAY set
== Info: Connected to localhost (127.0.0.1) port 8081 (#0)
=> Send header, 147 bytes (0x93)
0000: POST / HTTP/1.1
0011: Host: localhost:8081
0027: User-Agent: curl/7.58.0
0040: Accept: */*
004d: Content-Length: 4
0060: Content-Type: application/x-www-form-urlencoded
0091:
=> Send data, 4 bytes (0x4)
0000: Hi ?
== Info: upload completely sent off: 4 out of 4 bytes
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 20 bytes (0x14)
0000: Content-Length: 11
<= Recv header, 41 bytes (0x29)
0000: Content-Type: text/plain; charset=utf-8
<= Recv header, 37 bytes (0x25)
0000: Date: Mon, 10 Jun 2019 02:20:40 GMT
<= Recv header, 12 bytes (0xc)
0000: X-Ben: Rad
<= Recv header, 2 bytes (0x2)
0000:
<= Recv data, 11 bytes (0xb)
0000: Hello World
== Info: Connection #0 to host localhost left intact
HTTP 요청과 응답 헤더와 데이터등 모든 데이터에 대한 입/출력을 테스트 할 수 있다.
데이터 요청을 위한 가장간단한 방법이다. URL만 명시하는 것으로 테스트 할 수 있다.
# curl http://www.joinc.co.kr
# curl http://www.joinc.co.kr\?action\=getinfo\&id\=12345
GET 방식은 URL만으로 정보를 보낼 수 있지만, POST 방식의 경우 메시지를 body에 담아서 보내야 한다. -d, --data 옵션을 이용해서 데이터를 보낼 수 있다. 혹은 파일의 내용을 POST 데이터로 보낼 수도 있다. 파일을 읽어서 body로 보낼 경우
-d @filename 하면 된다.
# curl -d "name=yundream&age=19&address=Seoul ... ..." http://www.joinc.co.kr/curltest.php
# curl -X POST http://192.168.57.3:5984/mywiki/ -d @curl.json -H "Content-Type: application/json"
# curl -F upload=@dump.tar.gz -F "username=yundream" http://www.joinc.co.kr/curltest.php
반응형 웹 페이지를 만들 경우 user-agent에 따른 테스트가 필요하다. --user-agent 옵션을 이용해서 user agent 값을 변경할 수 있다.
# curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" http://www.joinc.co.kr
"-D(--dump-header) <filename>"로 헤더 정보를 파일로 보낼 수 있다. filename을 "-"로 하면 헤더를 표준출력할 수 있다.
# curl -D header.txt http://www.joinc.co.kr
# cat header.txt
HTTP/1.1 200 OK
Date: Thu, 04 Jul 2013 01:54:40 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Fri, 22 Jun 2012 06:58:22 GMT
ETag: "c43e-76-4c30a286a7f80"
Accept-Ranges: bytes
Content-Length: 118
Vary: Accept-Encoding
Content-Type: text/html
디버깅 목적으로 요청 헤더만 보고 싶을 수 있다.
-I 옵션을 사용하자.
curl https://www.joinc.co.kr/w/Site/Tip/curl -I
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 10 Jun 2019 02:36:50 GMT
Content-Type: text/html
Connection: keep-alive
X-Upstream: 127.0.0.1:8100
# curl -H "X-App-Pinpoint: app-trace-001918884" http://www.joinc.co.kr
전송된 헤더 정보는 아래와 같다.
GET / HTTP/1.1
Host: localhost:3000
User-Agent: curl/7.58.0
Accept: */*
X-App-Pinpoint: app-trace-001918884
두 개 이상 헤더 정보를 추가하는 것도 가능하다.
# curl -H "X-App-Pinpoint: app-trace-001918884" \
-H "X-App-Version: 1.0.5" localhost:3000
전송 헤더
GET / HTTP/1.1
Host: localhost:3000
User-Agent: curl/7.58.0
Accept: */*
X-App-Pinpoint: app-trace-001918884
X-App-Version: 1.0.5
HTTP는
User-Agent 헤더를 가지고 있으며, 여기에 Agent(HTTP 클라이언트) 정보를 입력할 수 있다. 이 정보는 서버통계와 디버깅등의 목적으로 사용한다. curl로 테스트해보자.
GET / HTTP/1.1
Host: localhost:3000
Authorization: Basic eXVuZHJlYW06cGFzc3dvcmQ=
User-Agent: curl/7.58.0
Accept: */*
요청한 HTTP 클라이언트가 curl 7.58.0 버전이라는 걸 확인 할 수 있다.
--user-agent로 agent 이름을 설정 할 수 있다.
# curl -u yundream:password http://localhost:3000 --user-agent "qa-test/1.0.0"
전송 헤더
GET / HTTP/1.1
Host: localhost:3000
Authorization: Basic eXVuZHJlYW06cGFzc3dvcmQ=
User-Agent: qa-test/1.0.0
Accept: */*
이 요청은 qa-test agent가 보낸 것임을 알 수 있다.