access.log 다운로드하기
- access.log 파일은 웹 서버에 접속 기록을 쌓아놓는 로그 파일
curl 패키지 다운로드
$ sudo apt-get update
$ sudo apt-get install -y curl
curl 파일 다운로드 옵션 살펴보기
curl -o
- 다운로드한 파일을 저장할 경로와 파일 이름을 지정
$ curl -o test_file https://test.com/ubuntu-18.04.6.iso
$ ls -lh ./
test_file
curl -O
- URL에서 파일 이름을 추출하여 현재 디렉토리에 저장
$ curl -O https://test.com/ubuntu-18.04.6.iso
$ ls -lh ./
ubuntu-18.04.6.iso
Quest 1
- curl 이용하여 위 파일 다운로드. 파일은 access.log 로 저장
- 이 파일은 공백을 기준으로 각 필드 구분이 가능함. 각 필드의 기능은?
Target URL
https://gist.githubusercontent.com/yrkimyy/82a0d437caceabda591d5ac172feb5fa/raw/fd00a5211cd9a1d2aa99114d997d16ef2ad0b2af/access.log
파일 다운로드
$ curl -o access.log https://gist.githubusercontent.com/yrkimyy/82a0d437caceabda591d5ac172feb5fa/raw/fd00a5211cd9a1d2aa99114d997d16ef2ad0b2af/access.log
파일 내용 살펴보기
$ cat ./access.log | head -n 1
192.128.1.1 - - [17/May/2015:10:05:03 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
각 필드의 역할 살펴보기
|------------|----------| |필드|내용| |192.128.1.1|클라이언트의 IP 주소입니다.| |-|클라이언트의 식별자(ID)입니다. 이 필드는 보통 비워두고 있습니다.| |-|사용자 인증이 필요한 경우 사용자 이름이 기록됩니다.이 필드는 보통 비워두고 있습니다.| |[17/May/2015:10:05:03 +0000]|요청이 발생한 시각입니다.| |"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1"|HTTP 요청 메서드와 요청한 리소스 경로, HTTP 버전입니다.| |GET|HTTP 요청 메서드입니다. 이 경우 GET 메서드가 사용되었습니다.| |/presentations/logstash-monitorama-2013/images/kibana-search.png|요청한 리소스의 경로입니다| |HTTP/1.1|HTTP 버전입니다.| |200|HTTP 응답 코드입니다. 이 경우 200은 "성공"을 의미합니다.| |203023|요청한 리소스의 크기(바이트)입니다.| |"http://semicomplete.com/presentations/logstash-monitorama-2013/"|이전에 방문한 페이지의 URL입니다.| |"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"|클라이언트에서 사용한 웹 브라우저의 정보입니다. 이 정보는 보통 "User-Agent"라고 부릅니다.|
접속 기록 통계 (1)
리눅스 커맨드를 사용해 access.log 파일에서 특정 IP 주소에 접속한 기록이 얼마나 많은지 조회하고자 함.
5.5.5.5에 접속한 기록 필터링 및 접속 횟수 조회
접속 기록 필터링
$ grep "5.5.5.5" ./access.log
접속 횟수 조회
$ grep "5.5.5.5" ./access.log | wc -l
357
Quest 2
- 파일 이름은 홈 디렉토리에 access_count.sh 로 생성
- 실행 가능한 쉘 스크립트로 작성 (권한수정)
- access_count.sh 구현 시, 각종 출력 관련 명령어 (grep,cat 등)을 활용하고, 파이프를 이용해 연결하여 구현
- 357 이라는 숫자 출력이 되어야 함
스크립트 작성
$ vim access_count.sh
#!/bin/bash
#!/bin/bash
# Set IP
TARGET_IP='5.5.5.5'
# Set file
TARGET_FILE='./access.log'
/bin/grep "${TARGET_IP}" "${TARGET_FILE}" | /usr/bin/wc -l
권한 수정
$ chmod 700 ./access_count.sh
스크립트 실행
$ ./access_count.sh
접속 기록 통계 (2)
access.log 에서 마지막 100줄의 로그 중, 상태 코드가 200인 로그를 추출하여 새로운 파일에 저장하고자 함.
어떻게 해야 필터링한 로그만 별도로 저장할 수 있을까?. 또 새롭게 만든 파일에는 총 몇 줄의 로그가 있을까?
$ tail -n 100 ./access.log | grep '200' > ./response_200.log | wc -l
94
Quest 3
- 파일 이름은 홈 디렉토리에 response_200_count.sh 로 생성
- 실행 가능한 쉘 스크립트로 작성 (권한수정)
- 필터링한 로그는 response_200.log 로 저장
- 93이라는 숫자가 출력 되어야 함
스크립트 작성
$ vim response_200_count.sh
#!/bin/bash
TARGET_FILE='./access.log'
/usr/bin/tail -n 100 "${TARGET_FILE}" | /bin/grep '200' > ./response_200.log | /usr/bin/wc -l
Quest 4
cut 사용하기
cat access.log | cut -d ' ' -f 1 | sort | uniq -c | sort -r |head
awk 사용하기
cat access.log | awk '{print $1}' | sort | uniq -c | sort -r | head
참고하기
쉘 스크립트에서 echo "Hello" 처럼이 아닌 /bin/echo 등과 같이 명시적으로 경로는 적는 이유?
- 경로 미지정시
command
명령어가 어디에 설치되어 있는지에 따라 다르게 동작할 수 있음- 다른 컴퓨터에서 같은 스크립트 실행할 때
command
를 찾을 수 없는 경우가 있을 수 있음
- 다른 컴퓨터에서 같은 스크립트 실행할 때
- 스크립트에서
/bin/command
와 같이 명시적으로 경로를 지정하면,command
명령어의 경로가 변경되어도 스크립트가 잘 동작할 수 있음. 예를 들어, /bin이 아닌 다른 경로에command
명령어가 설치된 경우, 스크립트에서/bin/command
를 사용하면 문제가 발생할 수 있음.