Linux Upskill 3. vim, apache, grep

jiffydev·2021년 4월 3일
0

linux upskill

목록 보기
3/8

본 포스트는 박재호님의 유튜브 강의를 보고 개인적으로 정리한 내용입니다.

1. vim

1-1. 명령어 실습

이전 포스트까지는 문서를 편집할 때 nano를 사용했지만, 앞으로는 vim을 사용해 편집하고자 한다. 이를 위해 vim에 대한 기초적인 실습을 이번 포스트에서 다룰 것이다.
우선 /etc/services 라는 파일을 testfile이라는 이름으로 home 디렉토리에 복사할 것이다.

ubuntu@ip-172-26-9-205:~$ cp /etc/services testfile

1-1-1. vi로 편집하기

ls명령을 통해 services가 testfile이라는 이름으로 복사가 된 것을 확인할 수 있다.
이제 vim으로 파일을 열어보자

ubuntu@ip-172-26-9-205:~$ vi testfile

1-1-2. 커서 이동

커서를 이동할 때는 일반적으로 사용하는 화살표로도 가능하지만, vim 유저라면 hjkl에 익숙해지는 것이 바람직하다.
각 키는 다음과 같은 방향을 뜻한다. h(←) j(↓) k(↑) l(→)
처음 사용할 때는 매우 헷갈리지만 쓰다보면 익숙해질 날이 올 것이다. (대신 화살표 방향키를 써야할 때도 hjkl을 쓰려고 하게 되는 부작용이 발생한다)

1-1-3. vi 종료


아무것도 모르고 vim을 사용하다 보면 편집을 종료할 수 없다는 사실에 당황하게 된다.
그럴 때는 일단 esc를 두번 눌러서 명령 모드로 진입하여 :을 누른다.
그리고 q!를 입력하고 엔터를 누르면 빠져나올 수 있다. (이미지 하단)

q!명령은 파일을 저장하지 않고 종료하는 명령어이다.

1-1-4. 지우기

GUI 방식에서라면 마우스로 드래그해서 delete 버튼을 누르면 끝나겠지만 vim에서는 그렇게 호락호락하지 않다.
뒤에서 설명할 삽입모드로 들어가 쭉 지우는 방법도 있겠지만, 여기서는 d 명령어를 사용해 행 단위로 지워보도록 하겠다.

(사진에는 안보이지만 커서를 11/tcp부분에 놓았고, 우측 하단을 보면 5d라고 입력된 것을 볼 수 있다)

esc를 두번 눌러 명령 모드로 진입한 상태에서 지우고 싶은 부분의 첫 번째 행(커서 위치는 행 안에만 있으면 됨)에 커서를 놓고 5d를 입력한 후 엔터를 눌러보자.

다섯 줄이 사라진 것을 볼 수 있다. 여기서 바로 u 키를 누르면 실행한 명령을 번복할 수 있다.(undo)

1-1-4. 그 외 명령

G: 파일의 끝으로 이동
gg: 파일의 처음으로 이동
/: 입력한 문자열을 검색한다. n키를 누르면 다음으로 일치하는 문자열을 보여준다.
dd: 커서가 위치한 행을 삭제한다. 앞에 숫자를 붙이면 숫자만큼의 행이 삭제된다.
yy: 커서가 위치한 행을 복사한다. 앞에 숫자를 붙이면 숫자만큼의 아래 행이 복사된다.
p: 복사한 행을 커서가 있는 행 아래에 붙여넣기 한다.

1-1-5. 입력 모드

o, O: 소문자는 커서가 위치한 행 아래로 개행하고 대문자는 행 위로 개행하여 입력 모드로 전환한다.
i: 커서가 위치한 글자 앞에서부터 입력한다.
a: 커서가 위치한 글자 뒤에서부터 입력한다.

당연한 얘기지만 입력 모드에서는 hjkl 방향키가 먹히지 않으므로 커서를 이동하려면 esc를 두 번 눌러 명령 모드로 돌아가야 한다.
마지막으로, 저장 후 종료하려면 명령 모드에서 :wq를 입력하고 엔터를 누르면 된다.

2. apache

이번에는 현재 가장 많이 쓰이고 있는 웹 서버중 하나인 아파치를 설치하여 사용해보자.
매번 apt로 설치할 때 하는 말이지만 마지막으로 서버를 실행한 뒤 시간이 좀 지났다면update, upgrade 명령을 실행 후 설치하자.

sudo apt install apache2

2-1. 명령어 실습

2-1-1. 서버 상태

아파치 서버를 시작/중지/상태확인 할 때는 systemctl과 조합하여 사용한다.

# 중지 후 상태 확인
ubuntu@ip-172-26-9-205:~$ sudo systemctl stop apache2
ubuntu@ip-172-26-9-205:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: inactive (dead) since Sat 2021-04-03 06:58:42 UTC; 1s ago
  Process: 25959 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
 Main PID: 25514 (code=exited, status=0/SUCCESS)
 
Apr 03 06:58:42 ip-172-26-9-205 systemd[1]: Stopping The Apache HTTP Server...
Apr 03 06:58:42 ip-172-26-9-205 systemd[1]: Stopped The Apache HTTP Server.
# 다시 시작 후 상태 확인
ubuntu@ip-172-26-9-205:~$ sudo systemctl start apache2
(base) ubuntu@ip-172-26-9-205:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Sat 2021-04-03 06:58:49 UTC; 1s ago
  Process: 25959 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 25981 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 25998 (apache2)
    Tasks: 55 (limit: 547)
   CGroup: /system.slice/apache2.service
           ├─25998 /usr/sbin/apache2 -k start
           ├─26000 /usr/sbin/apache2 -k start
           └─26001 /usr/sbin/apache2 -k start

Apr 03 06:58:48 ip-172-26-9-205 systemd[1]: Starting The Apache HTTP Server...
Apr 03 06:58:49 ip-172-26-9-205 systemd[1]: Started The Apache HTTP Server.

2-1-2. 아파치 설정 파일

설정 파일은 /etc/apache2/apache2.conf이다.
이 파일을 vim으로 열어서 확인해보자. 파일을 열었을 때 나오는 각각의 문장이 무슨 뜻인지는 지금 당장 알 필요는 없고, 검색(/)으로 IncludeOptional을 찾아보자.

이 IncludeOptional이 뜻하는 것은, 메인인 apache2.conf를 연 후 conf-enabled의 conf파일과 sites-enabled의 conf파일을 차례로 읽겠다는 뜻이다.
따라서 메인 파일인 apache2.conf를 직접 수정하기보다는 사이트에 맞거나 연관된 것들을 따로 모아 놓는 것이 좋다.

2-1-3. 서버에 접속해보기

가장 간단하게 접속해볼 수 있는 방법은 curl을 사용하는 것이다.

curl localhost

명령을 실행해보면 html로 작성된 페이지가 터미널에 표시될 것이다.
실제로 접속이 되었는지 확인해볼 때는 access로그를 확인하면 알 수 있다.
/var/log/apache2에 access.log파일이 있으므로 vim으로 열어보자.

127.0.0.1(localhost)의 index.html에 접속했다는 기록이 남은 것을 볼 수 있다.
이를 직접 사용하는 웹 브라우저에서 접근하기 위해서는 EC2 인스턴스로 가서 퍼블릭 IPv4주소를 찾아 주소창에 입력해보자.
원본 유튜브의 강의 영상대로 따라했다면 ssh접속만 허용한 상태이기 때문에 접속이 되지 않는 것을 알 수 있다.
따라서 인바운드 규칙을 수정하여 80번 포트를 개방하도록 설정한 후 접속하면 아래와 같은 페이지가 나올 것이다.

access.log에도 웹 브라우저에서 접속한 것으로 나와 있다.

3. grep

이전에도 사용한 적은 있었지만 grep은 문자열 탐색을 도와주는 명령어이다. 이를 잘 사용하면 아무리 긴 파일이라도 필요한 내용만 골라서 원하는 대로 출력할 수 있기 때문에 사용법을 철저히 익혀놓는 것을 추천한다.

3-1. 명령어 실습

3-1-1. head, tail

파일의 내용을 출력하는 명령어는 많다. cat, more, less 등등..
head와 tail은 파일의 첫 10줄 또는 마지막 10줄만 보여주는 명령어이다.
/var/log의 auth.log 파일을 가지고 확인해보자.

3-1-2. tail -f

아파치 서버를 열면서 확인했던 access.log를 다시 떠올려보자. 누가 접속했을 때마다 로그를 확인하려면 어떻게 해야 할까?
물론 계속 tail access.log를 실행해서 확인할 수도 있지만 번거로운 일이다.
이 때 -f 옵션을 추가해서 실행해 보면 표준출력 상태에서 멈춰있고, 접속할 때마다 정보가 추가되는 것을 알 수 있다. (ctrl+c로 종료할 수 있다)

3-1-3. grep, cut

/var/log의 auth.log로 돌아와 grep을 실제로 사용해보자.

ubuntu@ip-172-26-9-205:/var/log$ grep "authenticating" auth.log

authenticating이 들어간 행만 출력된 것을 볼 수 있다.
여기서 추가로 root 유저만 확인하려면 grep 명령을 뒤에 덧붙이면 된다.

ubuntu@ip-172-26-9-205:/var/log$ grep "authenticating" auth.log | grep "root"

그리고 root가 아닌 유저에 대해서만 확인하고자 한다면 -v 옵션을 붙여주면 된다.

ubuntu@ip-172-26-9-205:/var/log$ grep "authenticating" auth.log | grep -v "root"

그런데 명령들을 실행한 결과를 보면 알겠지만, 각 행의 길이가 너무 길다. 우리가 필요한 정보는 행의 전체는 아니므로 각 행의 필요한 부분만 잘라서 표현하고 싶다.
이 때는 cut -f명령을 사용하여 한 행을 필드로 나누고, 필드에 해당하는 숫자만 입력함으로써 필요한 부분만 출력할 수 있다.
또한 -d 옵션으로 구분자(delimiter)를 지정하여 나눌 수 있다.(예: 공백, 콤마 등)

그래서 이를 활용하여 authenticating과 root를 포함하고, 각 행을 공백으로 구분하여 10번 필드 이후의 문장만 출력하도록 하면 다음과 같이 표현할 수 있다.

grep "authenticating" auth.log | grep "root" | cut -f 10- -d " "
profile
잘 & 열심히 살고싶은 개발자

0개의 댓글