[명령] curl

markyang92·2021년 5월 10일
0

linux (ubuntu/debian)

목록 보기
9/37
post-thumbnail

curl

  • Client URL
    • 클라이언트에서 CLI나 source code로 손 쉽게 웹 브라우저 처럼 활동할 수 있도록 해주는 기술
    • url을 가지고 할 수 있는 것들은 다 할 수 있다.
  • 사용법
$ curl [-option] URI
  • 기본적으로 옵션 없이 $ curl URI를 사용하면, client의 요청에 대한,
    server의 응답의 contentSTDOUT으로 출력한다.
optiondescription
-k, --insecurehttps 사이트를 SSL certificate 검증없이 연결한다.
wget 의 --no-check-certificate 과 비슷한 역할 수행
-l, --head서버의 응답을 HTTP header 만 보여주고 content 는 표시하지 않는다.
단, 결과를 html로 보여준다.
-D, --dump-header <file><file> 에 HTTP header 를 기록한다.
-L, --location서버에서 HTTP 301 이나 HTTP 302 응답이 왔을 경우 redirection URL 로 따라간다.
예를 들어 $ curl -i daum.net을 입력하면 아래와 같이

HTTP/1.1 301 Moved Permanently
Location: https://doum.net

나오는데, 위 redirection URL로 재접속해 결과를 받아온다.
--max-redirs뒤에 숫자로 redirection 을 몇 번 따라갈지 지정할 수 있다. 기본 값은 50이다
-v --verbose동작하면서 자세한 옵션 출력
-d --dataHTTP Post data FORM 을 POST 하는
HTTP나 JSON 으로 데이타를 주고받는 REST 기반의 웹서비스 디버깅시 유용한 옵션이다
-J --remote-header-name어떤 웹서비스는 파일 다운로드시 Content-Disposition Header 를 파싱해야
정확한 파일이름을 알 수 있을 경우가 있다.
-J 옵션을 주면 헤더에 있는 파일 이름으로 저장한다. curl 7.20 이상부터 추가된 옵션
-o --output FILEcurl 은 remote 에서 받아온 데이타를 기본적으로는 콘솔에 출력한다.
-o 옵션 뒤에 FILE 을 적어주면 해당 FILE 로 저장한다. (download 시 유용)
-O --remote-namefile 저장시 remote 의 file 이름으로 저장한다.
-o 옵션보다 편리하다.
-s --silent정숙 모드. 진행 내역이나 메시지등을 출력하지 않는다.
-o 옵션으로 remote data 도 /dev/null 로 보내면 결과물도 출력되지 않는다.
HTTP response code 만 가져오거나 할 경우 유리
-I URI서버의 응답을 HTTP header 만 보여주고 content 는 표시하지 않는다.
--max-time <sec><sec> 단위로 응답 타임아웃을 설정한다.
서버에 요청을 보냈는데, block되는 경우 막을 수 있다.
-l, --list-onlycurl 로 listing 만함

예제

1. HTTP/HTTPS Download

1. HTTP/HTTPS로 다운로드

  1. 다운로드 받은 'http', 'https' 파일을 콘솔로 출력
$ curl <http(s) url>
$ curl https://www.naver.com
<strong class="title elss">[시승기]따뜻한 봄날을 기다리는 19년만의 현대자동차 SUV 경차 '캐스퍼'</strong>
                        <p class="desc">국내자동차시장이 커지면서 다양한 종류의 모델이 생산되고 있지만, 점점 생산량이 줄어들고 있는 세그먼트가 있다. 바로 경차 시장인 A세그먼트 모델들이다. 국내 자동차 시장에서 SUV의 인기가 높아지면서, 가장 큰 영향력을 받은 모델도 아마 경차모델이 아닐까??이런 분위기 속에 경차가 나왔다. 아니 경형 SUV가 출시하고 큰 관심을 모으고 있다.과거 &#x27;티코&#x27;
... 중략                  

  1. 다운로드 받은 'http', 'https' 파일을 지정한 파일저장
$ curl -o <FILE_NAME> <URL>

  1. 서버의 파일 네임으로 저장
$ curl -O <URL>

2. 다운로드URL 다운:-L -o

$ curl -L <Download URL> -o <File Name> # Curl을 이용한 다운로드

$ md5sum <File Name> # 다운로드 파일 md5 checksum 확인

  1. 사이트링크: https://download.cirros-cloud.net/0.4.0/
  2. 사이트링크/다운로드할 이미지 URL: https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

  1. curl을 이용해 다운로드
$ curl -L https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img -o cirros-0.4.0-x86_64-disk.img

MD5 해시 확인

  1. MD5 해시 값 확인
  • md5sum을 이용하는 이유: 해당 파일이 변경되지 않고 제대로 전송되었는지 확인

4-1. 다운로드 받은 파일의 md5sum 확인

$ md5sum cirros-0.4.0-x86_64-disk.img
443b7623e27ecf03dc9e01ee93f67afe  cirros-0.4.0-x86_64-disk.img

4-2. 사이트에서와 일치하는 지 확인


3. -LO: output file 자동

$ curl -LO [URL] -> 마지막 파일명으로 다운로드됨

  • diskus를 다운 받는 예제
$ curl -LO https://github.com/sharkdp/diskus/releases/download/v0.6.0/diskus_0.6.0_amd64.deb


diskus_0.6.0_amd64.deb 되어 있음

4. -C: 이어 받기

  • -C/--continue-at <offset>을 주면 이어받기가 가능하다.
    • <offset>'-'를 주면 전송 이후 부분부터 이어받는다.
$ curl -C - -LO <URL>

curl로 접속 확인

$ curl -I IP:PORT

$ curl -I 192.168.9.1:11500
HTTP/1.1 200 OK
Date: Tue, 30 Nov 2021 04:47:49 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Type: text/html;charset=UTF-8

$ curl -I 개인서버/downloads
HTTP/1.1 301 Moved Permanently
Date: Tue, 30 Nov 2021 04:47:56 GMT
Server: Apache/2.4.29 (Ubuntu)
Location: http://개인서버/downloads
Content-Type: text/html; charset=iso-8859-1

$ echo $?
0

301 Moved Permanently

HTTP 응답 상태 코드 301 Moved Permanently는 영구적인 URL 리다이렉션을 위해 사용되며, 즉 응답을 수신하는 URL을 사용하는 현재의 링크나 레코드가 업데이트되어야 함을 의미한다. 이 새 URL은 응답에 포함된 위치 필드에 지정되어야 한다. 301 리다이렉트는 사용자가 HTTP를 HTTPS로 업그레이드하게 만드는 최상의 방법으로 간주된다.

RFC 2616은 다음과 같이 언급한다:[2]

클라이언트가 링크 편집 기능이 있으면 요청 URL에 대한 모든 참조를 업데이트해야 한다.
특별한 표시가 없으면 응답은 캐시가 가능할 것.
요청 메소드가 HEAD가 아닌 경우 엔티티는 새로운 URL로 향하는 하이퍼링크와 함께 크기가 작은 하이퍼텍스트 참고사항을 포함해야 한다.
GET이나 HEAD 외의 요청에 대해 301 상태 코드를 수신할 경우 클라이언트는 리다이렉트 전에 사용자에게 물어보아야 한다.

wiki

[클라이언트 요청]

GET /index.php HTTP/1.1
Host: www.example.org

 

[서버 응답]

HTTP/1.1 301 Moved Permanently

Location: http://www.example.org/index.asp

  • 예를 들어 정확한 위치는 www.naver.com/downloads/ 인데, curl -I www.naver.com/downloads만 명시한 경우

접속 실패의 경우

--max-time <sec>: 타임아웃 걸기

  • curl 명령어 실행 시, blocking 상태가 되는데, 이 때 timeout 초를 지정한다.
    • 해당 시간 지정 후에도 응답이 없으면 28: Connection timed out 에러를 출력한다.
$ curl --max-time 5 192.168.0.1
curl: (28) Connection timed out after 5001 milliseconds
$ echo ?
28

Not Found: 발견 못함

  • Not Found
➜  ~ curl -I 개인서버/틀린주소
HTTP/1.1 404 Not Found
Date: Tue, 30 Nov 2021 04:52:28 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Type: text/html; charset=iso-8859-1

$ echo $?
0

Connection refused: 서버 찾음, PORT 비활성화

  • Not Listening Port
    • os가 가동중이나 port가 비활성화
    • 방화벽 때매 막힘
➜  ~ curl -I 개인서버:틀린포트
curl: (7) Failed to connect to 개인서버 port 틀린포트: Connection refused

echo $?
7

No route to host: 할당되지 않은 IP 호출

  • IP로 장비는 연결되어 있으나, OS가 기동되어 있지 않은 경우

Could not resolve host: 잘못된 도메인


Connection timed out: 응답 패킷 수신 실패


directory list

curl -sL "$server" --list-only | sed -n 's%.*href="\([^.]*\.rdf\.gz\)".*%\n\1%; ta; b; :a; s%.*\n%%; p'
citations.rdf.gz
databases.rdf.gz
diseases.rdf.gz
enzyme.rdf.gz
go.rdf.gz
journals.rdf.gz
keywords.rdf.gz
locations.rdf.gz
pathways.rdf.gz
taxonomy.rdf.gz
tissues.rdf.gz
uniparc.rdf.gz
uniprot.rdf.gz
uniref.rdf.gz

download script

  • 파일 서버에, 다운로드할 파일들의 디렉토리에 들어가 직접 하나하나 받기 힘든 경우
#!/bin/bash

site="http://server/all"

curl -sL ${site} | awk -F '<a |</a>' '{print$2}' | egrep "^href=" | awk -F '>' '{print$NF}'" | \
xargs -i -P 1 -n 1 bash -c "curl -sLO ${site}{}"


profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글