Study: ComputerScience(CS)/CS: Linux

[Linux] 리눅스 cURL 명령어: 다양한 프로토콜로 웹 요청 / 원하는 파일을 내려받자.

DrawingProcess 2022. 7. 20. 05:57
반응형
cURL을 이용하여 다양한 통신 프로토콜에 데이터를 전송할 수 있습니다.
일반적으로 웹 서비스 개발 시 테스트 및 디버깅 용도로 많이 사용되고 cmd에서 실행 가능하므로 웹 요청에 필요한 배치 작업을 자동화할 수 있습니다.

옵션

short long Discription etc
-k --insecure https 사이트를 SSL certificate 검증없이 연결한다. wget 의 --no-check-certificate 과 비슷한 역할 수행
-l --head HTTP header 만 보여주고 content 는 표시하지 않는다  
-D --dump-header <file> <file> 에 HTTP header 를 기록한다.  
-L --location 서버에서 HTTP 301 이나 HTTP 302 응답이 왔을 경우 redirection URL 로 따라간다.
--max-redirs 뒤에 숫자로 redirection 을 몇 번 따라갈지 지정할 수 있다. 기본 값은 50이다
curl -v daum.net 을 실행하면 결과값으로 다음과 같이 HTTP 302 가 리턴된다.
< HTTP/1.1 302 Object Moved
< Location: http://www.daum.net/
-L 옵션을 추가하면 www.daum.net 으로 재접속하여 결과를 받아오게 된다.
-d --data HTTP Post data를 전송한다 FORM 을 POST 하는 HTTP나 JSON 으로 데이타를 주고받는 REST 기반의 웹서비스 디버깅시 유용한 옵션이다
-G --get HTTP GET data를 전송한다.  
-X --request Request method를 지정한다. 기본 값 = POST
-v --verbose  동작하면서 자세한 옵션을 출력한다.  
-J --remote-header-name 어떤 웹서비스는 파일 다운로드시 Content-Disposition Header 를 파싱해야 정확한 파일이름을 알 수 있을 경우가 있다. -J 옵션을 주면 헤더에 있는 파일 이름으로 저장한다. curl 7.20 이상부터 추가된 옵션
-o --output FILE curl 은 remote 에서 받아온 데이타를 기본적으로는 콘솔에 출력한다. -o 옵션 뒤에 FILE 을 적어주면 해당 FILE 로 저장한다. (download 시 유용)  
-O --remote-name file 저장시 remote 의 file 이름으로 저장한다. -o 옵션보다 편리하다.  
-s --silent 정숙 모드. 진행 내역이나 메시지등을 출력하지 않는다. -o 옵션으로 remote data 도 /dev/null 로 보내면 결과물도 출력되지 않는다 HTTP response code 만 가져오거나 할 경우 유리
-b --cookie 쿠키 값을 전송한다.  
-H --header Content-Type을 지정한다.  
  --trace-ascii HTTP 데이터 통신 과정의 상세 정보를 출력한다.  

 

사용 예제 (데이터 요청)


GET 요청

 curl -G http://webisfree.com/action/?param1=value1&m2=value2

POST 요청

예제 ① 
 curl http://test.com/post -d param1=value1 -d param2=value2
예제 ② 
 curl http://test.com/post -d "param1=value1&m2=value2"

SSL 인증서 검증

curl은 https 사이트의 SSL 인증서를 검증한다.
인증서 목록이 없거나 알 수 없는 기관에서 발급한 인증서는 다음과 같은 인증서 검증 에러를 발생시킨다.
curl: (77) schannel: next InitializeSecurityContext failed:
SEC_E_UNTRUSTED_ROOT (0x80090325) - 신뢰되지 않은 기관에서 인증서 체인을 발급했습니다.
아래처럼 HTTPS 검증을 하지 않는 옵션을 사용하거나 인증기관 목록을 추가하여 해결한다.
 curl -k https://test.com/

프로토콜 디버깅 (통신과정 확인)

curl --trace-ascii test.dump http://www.test.com/test

Content-Type 지정

① 폼 데이터 전송 
 curl http://test.com/post -d "param1=value1&m2=value2" -H "Content-Type: application/x-www-form-urlencoded"

① JSON 데이터 전송 

 curl http://test.com/post -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}'

쿠키 값 지정

 curl http://test.com/home -b "JSESSIONID=7A22ABF5FBA40538BD06A97FFA815F7E"

 

사용 예제 (데이터 받기)


응답을 파일에 쓰기

$ curl http://jeonkkochbi.tistory.com/resource > foo.txt

 

그냥 옵션 없이 curl를 사용하면 표준출력으로 request 출력,
그러므로 예제처럼 리다이렉트해서 바로 파일에 쓸 수 있다.

// -o : 파일이름 변경하여 저장
$ curl -o foo.txt http://jeonkkochbi.tistory.com/foo.txt

// -O : 파일이름 그대로 저장
$ curl -O foo.txt http://jeonkkochbi.tistory.com/foo.txt

여러 파일을 다운로드

$ curl -O http://jeonkkochbi.tistory.com/foo[0-9].txt
$ curl -O http://jeonkkochbi.tistory.com/foo-[a-z][0-9].txt
  • foo0.txt 부터 foo9.txt 파일을 다운로드 받는 것도 가능하며,
  • []는 여러 번 조합할 수 있고, foo-a0.txt 부터 foo-z9.txt 까지 파일을 내려받습니다.
$ curl -O http://jeonkkochbi.tistory.com/{foo,bar,baz}.txt
  • 중괄호를 써서 리스트(list)자료형을 호출할 수도 있다. foo.txt, bar.txt, baz.txt 를 다운로드 받는다.

shell 의 for문 활용 (고급)

$ files="foo bar baz"
$ for name in files; do
    curl -O "http://jeonkkochbi.tistory.com/${name}.txt"
  done

참고



반응형