분류 기타

curl을 사용하여 명령줄에서 인터넷 사용

컨텐츠 정보

  • 조회 104 (작성일 )

본문

Curl은 그래픽 인터페이스를 사용하지 않고 인터넷에서 필요한 정보를 가져오는 빠르고 효율적인 방법입니다.


Curl은 일반적으로 비대화형 웹 브라우저로 간주됩니다. 

즉, 인터넷에서 정보를 가져와 터미널에 표시하거나 파일에 저장할 수 있습니다. 

이것은 말 그대로 Firefox 또는 Chromium과 같은 웹 브라우저가 기본적으로 정보를 렌더링하는 반면 curl은 원시 정보를 다운로드하여 표시한다는 점을 제외하고 수행하는 작업입니다. 

실제로 curl 명령은 HTTP, FTP, SFTP, IMAP, POP3, LDAP, SMB, SMTP 등을 포함하여 지원되는 많은 프로토콜 중 하나를 사용하여 서버와 데이터를 주고받는 기능이 훨씬 더 많습니다. 

일반 터미널 사용자에게는 유용한 도구이고 시스템 관리자에게는 매우 편리한 도구이며 마이크로서비스 및 클라우드 개발자에게는 품질 보증 도구입니다.


Curl은 사용자 상호 작용 없이 작동하도록 설계되었으므로 Firefox와 달리 처음부터 끝까지 온라인 데이터와의 상호 작용에 대해 생각해야 합니다. 예를 들어 Firefox에서 웹 페이지를 보려면 Firefox 창을 실행합니다. Firefox를 연 후 방문하려는 웹사이트를 URL 필드나 검색 엔진에 입력합니다. 그런 다음 사이트로 이동하여 보고 싶은 페이지를 클릭합니다.


모든 작업을 한 번에 수행한다는 점을 제외하고는 동일한 개념이 curl에 적용됩니다. 원하는 인터넷 위치를 제공하고 데이터를 터미널에 저장할지 아니면 파일에 저장할지 여부를 알려주는 동시에 curl을 시작합니다. 인증이 필요한 사이트나 API와 상호 작용해야 하는 경우 복잡성이 증가하지만 curl 명령 구문을 배우면 두 번째 천성이 됩니다. 이해를 돕기 위해 관련 구문 정보를 편리한 치트 시트에 수집했습니다.


url이 있는 파일 다운로드 


특정 URL에 대한 링크를 제공하여 curl 명령어로 파일을 다운로드할 수 있습니다. 기본적으로 index.html인 URL을 제공하면 인덱스 페이지가 다운로드되고 다운로드한 파일이 터미널 화면에 표시됩니다. 출력을 less 또는 tail 또는 다른 명령으로 파이프할 수 있습니다.


$ curl "http://example.com" | tail -n 4
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p>
    <p><href="https://www.iana.org/domains/example">More information...</a></p>
</div></body></html> 


일부 URL에는 셸에서 일반적으로 해석하는 특수 문자가 포함되어 있으므로 URL을 따옴표로 묶는 것이 가장 안전합니다.


일부 파일은 터미널에 표시되도록 잘 변환되지 않습니다. --remote-name 옵션을 사용하여 서버에서 호출된 파일에 따라 파일을 저장할 수 있습니다.


$ curl --remote-name "https://example.com/linux-distro.iso"
ls
linux-distro.iso 


또는 --output 옵션을 사용하여 원하는 대로 다운로드 이름을 지정할 수 있습니다.


curl "http://example.com/foo.html" --output bar.html 


curl을 사용하여 원격 디렉토리의 내용 나열 


curl은 비대화형이므로 페이지에서 다운로드 가능한 요소를 탐색하기가 어렵습니다. 연결하려는 원격 서버가 허용한다면 curl을 사용하여 디렉토리 내용을 나열할 수 있습니다.


curl --list-only "https://example.com/foo/" 


부분 다운로드 계속 


매우 큰 파일을 다운로드하는 경우 다운로드를 중단해야 할 수 있습니다. Curl은 다운로드를 중단한 부분을 확인하고 다운로드를 계속할 만큼 충분히 지능적입니다. 즉, 다음에 4GB Linux 배포 ISO를 다운로드할 때 문제가 발생하더라도 처음으로 돌아갈 필요가 없습니다. --continue-at의 구문은 약간 특이합니다. 다운로드가 중단된 바이트 수를 알고 있으면 제공할 수 있습니다. 그렇지 않으면 단독 대시(-)를 사용하여 curl에 자동으로 감지하도록 지시할 수 있습니다.


curl --remote-name --continue-at - "https://example.com/linux-distro.iso" 


파일 시퀀스 다운로드 


하나의 큰 파일이 아닌 여러 파일을 다운로드해야 하는 경우 curl이 도움이 될 수 있습니다. 다운로드하려는 파일의 위치와 파일 이름 패턴을 알고 있다고 가정하면 curl의 시퀀싱 표기법을 사용할 수 있습니다. 정수 범위 사이의 시작과 끝 지점(괄호)을 사용할 수 있습니다. 출력 파일 이름의 경우 #1을 사용하여 첫 번째 변수를 나타냅니다.


curl "https://example.com/file_[1-4].webp" --output "file_#1.webp" 


다른 변수를 사용하여 다른 시퀀스를 나타내야 하는 경우 명령에 나타나는 순서대로 각 변수를 표시하십시오. 예를 들어 이 명령에서 #1은 images_000부터 images_009까지의 디렉토리를 참조하고 #2는 file_1.webp에서 file_4.webp까지의 파일을 나타냅니다.


$ curl "https://example.com/images_00[0-9]/file_[1-4].webp" \
--output "file_#1-#2.webp" 


사이트에서 모든 PNG 파일 다운로드 


curl과 grep만 사용하여 다운로드하려는 항목을 찾기 위해 기본적인 웹 스크래핑을 수행할 수도 있습니다. 

예를 들어 보관 중인 웹 페이지와 연결된 모든 이미지를 다운로드해야 한다고 가정해 보겠습니다. 

먼저 이미지를 참조한 페이지를 다운로드합니다. 대상 이미지 유형(이 예에서는 PNG)에 대한 검색을 사용하여 페이지를 grep으로 파이프합니다. 마지막으로 while 루프를 만들어 다운로드 URL을 구성하고 파일을 컴퓨터에 저장합니다.


$ curl https://example.com |\
grep --only-matching 'src="[^"]*.[png]"' |\
cut -d\" -f2 |\
while read i; do \
curl https://example.com/"${i}" -o "${i##*/}"; \
done 


이것은 단지 예일 뿐이지만 Unix 파이프 및 일부 영리하지만 기본적인 구문 분석과 결합될 때 curl이 얼마나 유연한지 보여줍니다.


HTML 헤더 가져오기 


데이터 교환에 사용되는 프로토콜에는 컴퓨터가 통신하기 위해 보내는 패킷에 많은 메타데이터가 포함되어 있습니다. HTTP 헤더는 데이터의 초기 부분의 구성 요소입니다. 사이트 연결 문제를 해결할 때 다음 헤더(특히 응답 코드)를 보는 것이 도움이 될 수 있습니다.


curl --head "https://example.com"
HTTP/2 200
accept-ranges: bytes
age: 485487
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Sun, 26 Apr 2020 09:02:09 GMT
etag: "3147526947"
expires: Sun, 03 May 2020 09:02:09 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (sjc/4E76)
x-cache: HIT
content-length: 1256 



Fail quickly 


200 응답은 성공의 일반적인 HTTP 표시기이므로 서버에 연결할 때 일반적으로 예상하는 것입니다. 유명한 404 응답은 페이지를 찾을 수 없음을 나타내고 500은 서버 오류가 있음을 의미합니다.


협상 중에 어떤 오류가 발생하는지 보려면 --show-error 플래그를 추가하십시오.


curl --head --show-error "http://opensource.ga" 


접속하는 서버에 액세스할 수 없는 경우 수정하기 어려울 수 있지만 일반적으로 curl은 사용자가 가리키는 위치를 해결하기 위해 최선을 다합니다. 때때로 네트워크를 통해 테스트할 때 겉보기에 끝이 없는 재시도는 시간을 낭비하므로 --fail-early 옵션을 사용하여 실패 시 curl을 빠르게 종료할 수 있습니다.


curl --fail-early "http://opensource.ga" 


3xx 응답으로 지정된 쿼리 리디렉션 


그러나 300 시리즈 응답은 더 유연합니다. 특히 301 응답은 URL이 영구적으로 다른 위치로 이동되었음을 의미합니다. 웹사이트 관리자가 이전 위치를 방문하는 사람들이 여전히 찾을 수 있도록 "흔적"을 남기면서 콘텐츠를 재배치하는 일반적인 방법입니다. Curl은 기본적으로 301 리디렉션을 따르지 않지만 --location 옵션을 사용하여 301 대상으로 계속 이동하도록 할 수 있습니다.


$ curl "https://iana.org" | grep title
<title>301 Moved Permanently</title>
$ curl --location "https://iana.org"
<title>Internet Assigned Numbers Authority</title> 


단축 URL 확장 


--location 옵션은 단축된 URL을 방문하기 전에 확인하려는 경우에 유용합니다. 

단축 URL은 문자 제한이 있는 소셜 네트워크(물론 최신 오픈 소스 소셜 네트워크를 사용하는 경우 문제가 되지 않을 수 있음) 또는 사용자가 긴 URL을 복사하여 붙여넣을 수 없는 인쇄 매체에 유용할 수 있습니다. 

그러나 목적지가 본질적으로 숨겨져 있기 때문에 약간 위험할 수도 있습니다. 

HTTP 헤더만 보는 --head 옵션과 URL의 최종 목적지를 밝히는 --location 옵션을 결합하면 전체 리소스를 로드하지 않고도 단축된 URL을 엿볼 수 있습니다.


$ curl --head --location \
"https://bit.ly/2yDyS4T" 


출처 : https://opensource.com/article/20/5/curl-cheat-sheet