리눅스의 history 명령은 꽤 자주 쓰곤 합니다. 그런데, 그것만 쓴 적은 없고, 보통 다른 명령어들과 pipe 해서 많이 쓰곤 했습니다. 그것에 대해서 간단하게 보도록 하겠습니다.

 


 먼저, echo $SHELL을 입력해 봅시다. 저 같은 경우에는, /usr/bin/zsh가 출력이 되는데요. 이는 제가 oh my zsh를 사용하기 위해서 zsh를 깔았기 때문입니다. 일단, echo $HISTFILE을 입력해 보도록 하겠습니다.

 

 

 그러면, /home/cho/.zsh_history가 나올 건데요. 이는 history가 어디에 저장되는지를 나타내는 변수입니다. 여기에서는 제가 있는 경로의 .zsh_history에 히스토리가 차곡 차곡 쌓이고 있다고 하는군요.

 

 

 제가 zsh에서 쳤던 명령어들이 저장이 되어 있습니다. bash_history도 있고, zsh_history도 있는데 이에 대해서는 뒤에서 이야기 하는 걸로 하겠습니다.

 

 

 보통 history는 정규식을 기반으로 패턴을 찾는 grep 명령어라던지, 파일의 맨 끝으로부터 n줄을 읽을 때 많이 쓰는 tail하고 결합하면 매우 강력합니다. 여기에서는, history 명령어의 출력 결과들 중에서, find 라는 패턴을 가지고 있는 행을 찾는 예입니다.

 


 

 이제 su 명령어를 입력해서, 루트 유저로 바꿔보겠습니다.

 

 

 대충 보아하니, .bash_history가 있고, .zsh_history가 있습니다. 제 리눅스 관련 들을 유심히 보셨다면 아실 지도 모르겠지만, 루트 권한으로 접속하면, 특유의 bash 쉘이 나오고 테마가 밋밋해졌다는 것을 눈치채셨을 겁니다. 사실, root에 zsh를 기본 쉘로 바꾸고, 테마를 적용한 것은 오늘이였습니다. 물론, /etc/passwd를 잘못 건드려서 부팅 디스크를 3번이나 쓴 건 안 비밀입니다.

 

 

 HISTFILE을 출력해 보니 /root/.zsh_history입니다. 그러면 이 파일을 보도록 하겠습니다.

 

 

 1597557266이라. 이 값을 24x3600으로 나누면 18490이 나오는데요. 1970년 1월 1일부터 18490일이 지난 경우, 2020년 8월 16일입니다. 그러면 오늘부터 zsh_history가 쌓였다는 이야기가 되겠습니다.

 

 

 history | grep mysql 명령어를 쳐 보면, 없다고 나옵니다. 간단합니다. mysql 명령어는 zsh에서 치지는 않았기 때문입니다. 그리고 HIST_FILE 변수를 출력해 보니, .zsh_history였는데, 이것은 최근의 명령어들만 저장이 되었고, history 명령어가 이 파일을 참조했다는 이야기가 됩니다. 이전에 root로 실행을 시켰던 mysql 명령어에 관한 것이 다른 파일에 있었다는 것을 의미합니다.

 

 

 .bash_history의 내용을 출력하는 명령어는 cat .bash_history입니다. 이 결과에서 mysql만 filtering을 해 보면 위와 같습니다. 정리하면 mysql 관련 명령어는 bash에서 실행을 시켰고, 그것에 관한 것들이 루트 디렉토리의 .bash_history에 저장이 되었다. 정도만 보시면 됩니다.

 


 저는 history하고, grep, tail 정도는 꽤 많이 조합해서 썼습니다. 저는, root가 bash에서 가장 최근에 쓴 sudo 명령이 어떤 것인지를 알고 싶습니다. 어떻게 하면 될까요? 일단, sudo를 필터링 하는 것과 cat .bash_history를 조합하면 됩니다.

 

 

 그런데, sudo가 포함된 게 모두 출력이 됩니다. 저는 sudo로 시작하는 것만 찾을 겁니다. 그럴려면, ^sudo를 입력하시면 됩니다. 이것은 정확하게 sudo로 시작하는 패턴을 찾아냅니다.

 

 

 이 중에서 가장 최근의 것을 뽑고 싶다고 하였으니, tail -n 1을 추가로 파이핑 해 주면 됩니다.

 

 

 결과는 위와 같습니다.