Post

Linux curl

1. curl

curl은 여러 프로토콜을 이용하여 네트워크 명령을 전송하는 도구이다. 지원되는 프로토콜 (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP 또는 FILE) 중 하나를 사용하여 서버간에 데이터를 전송할 수 있다.

프록시 지원, 사용자 인증, FTP 업로드, HTTP 게시, SSL 연결, 쿠키, 파일 전송 이력서 등과 같은 유용한 기능을 제공한다.

2. 주요 옵션

옵션설명
-o {파일명} {경로}지정한 파일명으로 파일 다운로드
-O {경로}파일 이름으로 다운로드
-s추가 정보없이 처리
-I헤더 정보만 확인
-i헤더정보 확인
-H헤더 정보 전달
-G파라미터 전달
-X메소드 타입 설정(기본 GET), POST, DELETE 등
-d전달 데이터, POST 타입일 때 json 형태로 입력하면 데이터 전달
-L3XX 응답이 오면 경로를 변경함
-x프록시 설정
-v상세
--trace-ascii <파일명>curl로 송신한 정보, 수신한 정보를 파일로 저장

3. 사용예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 파일 다운로드
$ curl -O http://apache.mirror.cdnetworks.com/oozie/4.3.1/oozie-4.3.1.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2374k  100 2374k    0     0  23.4M      0 --:--:-- --:--:-- --:--:-- 37.4M

# 파일 이름을 지정하여 다운로드
$ curl -o oozie.tar.gz http://apache.mirror.cdnetworks.com/oozie/4.3.1/oozie-4.3.1.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2374k  100 2374k    0     0  35.6M      0 --:--:-- --:--:-- --:--:-- 38.6M

# s 옵션을 이용하면 전송 속도와 같은 부가 정보가 나타나지 않음
$ curl -so oozie.tar.gz http://apache.mirror.cdnetworks.com/oozie/4.3.1/oozie-4.3.1.tar.gz

# i 옵션으로 헤더 정보 확인
$ curl -i http://127.0.0.1/latest/dynamic/instance-identity/document
HTTP/1.0 200 OK
Content-Type: text/plain
Accept-Ranges: bytes
ETag: "3177614890"
Last-Modified: Wed, 18 Sep 2019 04:09:27 GMT
Content-Length: 505
Connection: close
Date: Wed, 18 Sep 2019 04:13:18 GMT
Server: EC2ws

# H 옵션으로 헤더 전달
$ curl -H "Content-Type: application/json" http://127.0.0.1/latest/dynamic/instance-identity/document

# GET 방식 파라미터 전달
$ curl -G http://127.0.0.1/latest/dynamic/instance-identity/document?a=b

# POST 방식 파라미터 전달
$ curl http://127.0.0.1/latest/dynamic/instance-identity/document -d a=b
$ curl http://127.0.0.1/latest/dynamic/instance-identity/document -d "a=b&c=d"

# 메소드 변경
$ curl -X "DELETE" http://127.0.0.1/latest/dynamic/instance-identity/document

# POST 형식 데이터 전달
$ curl -X POST -d "{\"key\":\"val\"}" http://127.0.0.1

1) 프록시 설정

1
$ curl -x proxy_host:proxy_port http://target-url

2) HTTP 인증

특정 사이트에서 로그인 정보를 필요로 하는 경우 -u, --user 옵션을 이용해서 로그인 할 수 있다.

1
$ curl -X POST --user "user:password" http://airflow/api/v1/dags/sample/dagRuns

3) Kerberos 인증 사용

Kerberos 인증을 curl 명령으로 사용하는 경우에는 --negotiate 옵션을 이용한다.

1
2
3
# --negotiate 옵션을 사용하기 전에 kinit으로 Kerberos 인증을 해야 함
# -u: 옵션은 커버로스 인증을 사용
$ curl --negotiate -u: -sS -L -X GET -k https://name-node.com:8090

4) 송/수신한 데이터를 파일로 저장

curl을 사용하여 실제로 전달한 정보를 파일로 저장하여 확인하고 싶은 경우 --trace-ascii 옵션을 이용한다.

form을 이용하여 전달한 데이터가 실제로 어떻게 전달되는 지 확인하고, 수정할 때 유용하게 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# sample.log 파일에 송/수신 저장
curl --trace-ascii sample.log www.google.com

$ cat sample.log
== Info:   Trying 172.217.175.36:80...
== Info: Connected to www.google.com (172.217.175.36) port 80 (#0)
=> Send header, 78 bytes (0x4e)
0000: GET / HTTP/1.1
0010: Host: www.google.com
0026: User-Agent: curl/7.79.1
003f: Accept: */*
004c:
== Info: Mark bundle as not supporting multiuse
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 37 bytes (0x25)
0000: Date: Thu, 28 Apr 2022 05:22:37 GMT
<= Recv header, 13 bytes (0xd)
0000: Expires: -1
<= Recv header, 35 bytes (0x23)
0000: Cache-Control: private, max-age=0
<= Recv header, 45 bytes (0x2d)
0000: Content-Type: text/html; charset=ISO-8859-1
<= Recv header, 69 bytes (0x45)
0000: P3P: CP="This is not a P3P policy! See g.co/p3phelp for more inf
0040: o."

5) 파일 업로드

파일을 직접 업로드 하는 경우 --data-binary 옵션을 이용한다.

1
2
3
$ curl --location --request PUT 'https://url' \
--header 'Content-Type: application/octet-stream'\
--data-binary "@../user-file"

6) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1) 오류

curl을 이용할 때 이런 오류가 발생하는 경우에는 다음과 같이 http1.1 옵션을 추가한다.

1
2
3
$ curl --location --request PUT 'https://urlt' \
--header 'Content-Type: application/octet-stream' --http1.1 \
--data-binary "@../user-file"

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.