시스템 관리자가 자주 활용하는 도구 중 하나로 wget이 있습니다. 이는 웹 관련 문제 해결 과정에서 매우 효과적일 수 있습니다.
wget 명령어란 무엇일까요?
wget 명령어는 Unix/Linux 환경에서 웹 콘텐츠를 가져올 때 폭넓게 사용되는 명령줄 유틸리티입니다. 무료로 제공되며, 웹에서 파일을 비대화형 방식으로 다운로드하는 기능을 제공합니다. wget 명령어는 기본적으로 HTTPS, HTTP, 그리고 FTP 프로토콜을 지원합니다. 또한, HTTP 프록시 서버를 설정하여 이용할 수도 있습니다.
wget이 문제 해결에 기여하는 방법은 무엇일까요?
다양한 활용 방법이 존재합니다.
시스템 관리자는 주로 터미널 환경에서 작업하며, 웹 애플리케이션 관련 문제를 진단할 때 전체 웹페이지가 아닌 연결 상태만 확인하려 할 수 있습니다. 또는, 사내 인트라넷 웹사이트의 연결을 확인하거나, 특정 페이지를 다운로드하여 내용을 검토해야 할 수도 있습니다.
wget은 비대화형으로 작동하므로, 로그아웃 상태에서도 백그라운드에서 실행할 수 있습니다. 웹에서 파일을 가져오는 작업을 진행하는 동안 시스템 연결이 끊어져야 할 상황도 있을 수 있습니다. 이 경우, 백그라운드에서 실행 중인 wget이 할당된 작업을 계속하여 완료하게 됩니다.
또한, wget은 로컬 컴퓨터로 전체 웹사이트를 다운로드하는 데에도 활용될 수 있습니다. XHTML과 HTML 페이지 내의 링크를 따라가며 로컬 버전을 생성할 수 있으며, 이를 위해 페이지를 재귀적으로 다운로드하는 기능이 필요합니다. 이 기능을 통해 오프라인 상태에서 중요한 페이지나 웹사이트를 확인할 수 있어 매우 유용합니다.
이제 wget 명령의 작동 방식을 살펴봅시다. 기본적인 구문은 다음과 같습니다.
wget [옵션] [URL]
웹페이지 다운로드
웹페이지를 다운로드하는 실습을 해보겠습니다. 예를 들어, github.com을 다운로드해 보겠습니다.
wget github.com
연결이 정상적으로 이루어지면, 홈페이지를 다운로드하고 아래와 같은 결과를 출력합니다.
URL이 HSTS 정책에 따라 HTTPS로 변환되었습니다 --2020-02-23 10:45:52-- https://github.com/ github.com (github.com) 해석 중... 140.82.118.3 github.com (github.com)|140.82.118.3|:443에 연결 중... 연결됨. HTTP 요청 전송, 응답 대기 중... 200 OK 길이: 미지정 [text/html] 저장 위치: ‘index.html’ index.html [ <=> ] 131.96K --.-KB/s 0.04초 소요 2020-02-23 10:45:52 (2.89 MB/s) - ‘index.html’ 저장됨 [135126]
여러 파일 다운로드
여러 파일을 한 번에 다운로드해야 할 경우, wget은 매우 편리한 도구입니다. 이를 통해 스크립트를 활용한 파일 다운로드 자동화에 대한 아이디어를 얻을 수도 있습니다.
Python 3.8.1과 3.5.1 파일을 다운로드하는 예시를 보겠습니다.
wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
위에서 볼 수 있듯이, 구문은 다음과 같습니다.
wget URL1 URL2 URL3
URL 사이에 공백을 두기만 하면 됩니다.
다운로드 속도 제한
서로 다른 대역폭 환경에서 파일 다운로드 시간을 테스트해보고 싶을 때 유용하게 활용할 수 있습니다.
--limit-rate
옵션을 사용해 다운로드 속도를 제한할 수 있습니다.
다음은 Nodejs 파일을 다운로드한 결과입니다.
--2020-02-23 10:59:58-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz nodejs.org (nodejs.org) 해석 중... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ... nodejs.org (nodejs.org)|104.20.23.46|:443에 연결 중... 연결됨. HTTP 요청 전송, 응답 대기 중... 200 OK 길이: 14591852 (14M) [application/x-xz] 저장 위치: ‘node-v12.16.1-linux-x64.tar.xz’ node-v12.16.1-linux-x64.tar.xz 100%[===========================================================================================>] 13.92M --.-KB/s 0.05초 소요 2020-02-23 10:59:58 (272 MB/s) - ‘node-v12.16.1-linux-x64.tar.xz’ 저장됨 [14591852/14591852]
13.92MB 파일을 다운로드하는 데 0.05초가 소요되었습니다. 이제 속도를 500K로 제한해 보겠습니다.
--2020-02-23 11:00:18-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz nodejs.org (nodejs.org) 해석 중... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ... nodejs.org (nodejs.org)|104.20.23.46|:443에 연결 중... 연결됨. HTTP 요청 전송, 응답 대기 중... 200 OK 길이: 14591852 (14M) [application/x-xz] 저장 위치: ‘node-v12.16.1-linux-x64.tar.xz.1’ node-v12.16.1-linux-x64.tar.xz.1 100%[===========================================================================================>] 13.92M 501KB/s 28초 소요 2020-02-23 11:00:46 (500 KB/s) - ‘node-v12.16.1-linux-x64.tar.xz.1’ 저장됨 [14591852/14591852]
대역폭을 제한하자 다운로드 시간이 28초로 증가했습니다. 사용자들이 느린 다운로드 속도에 대해 불만을 제기할 때, 네트워크 대역폭이 부족하다는 것을 인지하고 --limit-rate
옵션을 사용하여 문제를 빠르게 시뮬레이션해 볼 수 있습니다.
백그라운드에서 다운로드
위에서 속도 제한을 설정하는 예시처럼, 대용량 파일 다운로드에는 시간이 오래 걸릴 수 있습니다. 이런 상황에서 터미널 창을 계속 쳐다보고 싶지 않다면 어떻게 해야 할까요?
-b
인수를 사용하여 wget을 백그라운드에서 실행할 수 있습니다.
백그라운드에서 계속 진행, pid 25430. 출력 결과는 ‘wget-log.1’ 파일에 저장됩니다.
인증서 오류 무시
내부망에서 적절한 인증서가 설정되지 않은 웹 애플리케이션을 점검해야 할 때 유용하게 사용할 수 있습니다. 기본적으로 wget은 인증서가 유효하지 않을 경우 오류를 발생시킵니다.
--2020-02-23 11:24:59-- https://expired.badssl.com/ expired.badssl.com (expired.badssl.com) 해석 중... 104.154.89.105 expired.badssl.com (expired.badssl.com)|104.154.89.105|:443에 연결 중... 연결됨. 오류: ‘CN=COMODO RSA Domain Validation Secure Server CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB’에서 발급한 expired.badssl.com의 인증서를 검증할 수 없습니다. 발급된 인증서가 만료되었습니다. expired.badssl.com에 안전하지 않은 방식으로 연결하려면 ‘--no-check-certificate’를 사용하십시오.
위의 예시는 인증서가 만료된 URL에 대한 결과입니다. 출력 메시지에서 알 수 있듯이, --no-check-certificate
옵션을 사용하여 모든 인증서 검증을 무시하도록 제안합니다.
--2020-02-23 11:33:45-- https://untrusted-root.badssl.com/ untrusted-root.badssl.com (untrusted-root.badssl.com) 해석 중... 104.154.89.105 untrusted-root.badssl.com (untrusted-root.badssl.com)|104.154.89.105|:443에 연결 중... 연결됨. 경고: ‘CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US’에서 발급한 untrusted-root.badssl.com의 인증서를 검증할 수 없습니다. 자체 서명된 인증서가 발견되었습니다. HTTP 요청 전송, 응답 대기 중... 200 OK 길이: 600 [text/html] 저장 위치: ‘index.html.6’ index.html.6 100%[===========================================================================================>] 600 --.-KB/s 0초 소요 2020-02-23 11:33:45 (122 MB/s) - ‘index.html.6’ 저장됨 [600/600]
매우 유용하지 않나요?
터미널에서 특정 웹사이트의 HTTP 응답 헤더를 확인해 보겠습니다.
Coursera 예시처럼 -S
옵션을 사용하면 헤더가 출력됩니다.
--2020-02-23 11:47:01-- https://www.coursera.org/ www.coursera.org (www.coursera.org) 해석 중... 13.224.241.48, 13.224.241.124, 13.224.241.82, ... www.coursera.org (www.coursera.org)|13.224.241.48|:443에 연결 중... 연결됨. HTTP 요청 전송, 응답 대기 중... HTTP/1.1 200 OK Content-Type: text/html Content-Length: 511551 Connection: keep-alive Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0 Date: Sun, 23 Feb 2020 11:47:01 GMT etag: W/"7156d-WcZHnHFl4b4aDOL4ZSrXP0iBX3o" Server: envoy Set-Cookie: CSRF3-Token=1583322421.s1b4QL6OXSUGHnRI; Max-Age=864000; Expires=Wed, 04 Mar 2020 11:47:02 GMT; Path=/; Domain=.coursera.org Set-Cookie: __204u=9205355775-1582458421174; Max-Age=31536000; Expires=Mon, 22 Feb 2021 11:47:02 GMT; Path=/; Domain=.coursera.org Strict-Transport-Security: max-age=31536000; includeSubDomains; preload X-Content-Type-Options: nosniff x-coursera-render-mode: html x-coursera-render-version: v2 X-Coursera-Request-Id: NCnPPlYyEeqfcxIHPk5Gqw X-Coursera-Trace-Id-Hex: a5ef7028d77ae8f8 x-envoy-upstream-service-time: 1090 X-Frame-Options: SAMEORIGIN x-powered-by: Express X-XSS-Protection: 1; mode=block X-Cache: Miss from cloudfront Via: 1.1 884d101a3faeefd4fb32a5d2a8a076b7.cloudfront.net (CloudFront) X-Amz-Cf-Pop: LHR62-C3 X-Amz-Cf-Id: vqvX6ZUQgtZAde62t7qjafIAqHXQ8BLAv8UhkPHwyTMpvH617yeIbQ== 길이: 511551 (500K) [text/html]
사용자 에이전트 조작
때로는 사용자 정의 사용자 에이전트를 사용하여 사이트에 연결해야 할 수 있습니다. 혹은, 특정 브라우저의 사용자 에이전트를 사용해야 할 수도 있습니다. 이는 --user-agent
옵션을 통해 가능합니다. 아래 예시는 MyCustomUserAgent라는 사용자 에이전트를 설정하는 방법입니다.
wget https://gf.dev --user-agent="MyCustomUserAgent"
만약 애플리케이션이 아직 개발 중인 상황이라면, 테스트에 사용할 적절한 URL이 없을 수 있습니다. 혹은, IP 주소를 사용하여 HTTP 인스턴스를 테스트할 수는 있지만, 애플리케이션이 제대로 작동하려면 호스트 헤더를 제공해야 할 수도 있습니다. 이러한 경우, --header
옵션을 활용할 수 있습니다.
호스트 헤더를 application.com으로 설정하여 http://10.10.10.1
을 테스트하는 예시를 살펴봅시다.
wget --header="Host: application.com" http://10.10.10.1
이처럼 호스트뿐 아니라 원하는 다른 헤더 정보도 추가할 수 있습니다.
프록시를 사용하여 연결
DMZ 환경에서 작업하는 경우, 인터넷 사이트에 직접 접속할 수 없을 수 있습니다. 이 경우에는 프록시 서버를 통해 연결할 수 있습니다.
wget -e use_proxy=yes http_proxy=$PROXYHOST:PORT http://externalsite.com
$PROXYHOST:PORT
변수를 실제 프록시 서버 주소와 포트로 업데이트해야 함을 잊지 마십시오.
특정 TLS 프로토콜을 사용하여 연결
일반적으로 OpenSSL을 활용하여 TLS 프로토콜을 테스트하는 것이 권장되지만, wget을 통해서도 가능합니다.
wget --secure-protocol=TLSv1_2 https://example.com
위 명령어는 wget이 TLS 1.2 프로토콜을 사용하여 연결하도록 설정합니다.
결론
필요한 명령어를 숙지하고 있다면 업무에 큰 도움이 될 수 있습니다. 이 글이 wget을 활용하는 데 있어 좋은 아이디어를 제공하기를 바랍니다.