Intro

리눅스에서 과거에 입력했던 명령어를 보고 싶다면?
histroy 라는 명령어를 통해 볼 수 있습니다.

오늘은 이 history 명령어에 대해 알아보겠습니다.



history

명령어

명령어 기능 옵션 설명
history 과거에 입력했던 명령어를 출력한다. -c RAM에 있는 history list를 삭제
    -a 파일에 history list에 있는 내용들을 추가
    -r history 파일을 읽고, history list에 내용을 추가
    -w 현재 history를 history 파일에 쓴다.
1
2
# (추가) 현재 세션의 history를 파일에 저장
$ history > ./history_2023_08_06.txt


예시

1
2
3
4
5
6
7
8
$ history

>>> 1   ifconfig
>>> 2   ufw status
>>> ...
>>> 55  ll
>>> 56  cd ./html
>>> 57  history


원리

세션

원리를 보기 전에, “세션”에 대한 정의부터 해야할 것 같습니다.
간단하게 말해 세션이란 “계정이 로그인했을 때부터 로그아웃할 때까지”를 뜻합니다.

보다 더 정확히는 그 동안의 상태와 정보도 포함해서요.

1
2
3
4
5
6
7
8
9
10
login
root#   ll
root#   cd ..
...
root#   exit
logout  -------> 여기까지 한 세션

login   -------> 여기서부터 새로운 세션
root#   docker-compose up -d
root#   apt-get update

history 저장의 원리

리눅스에 로그인한 사용자가 명령어를 입력하면, 메모리의 특정 부분에 사용자가 입력한 명령어들이 기록됩니다.
메모리는 세션이 유지되는 동안 해당 세션에서 입력된 명령어를 저장하고 있다가,
해당 세션이 종료될 때 “history 파일”에 현재 세션의 명령어 리스트를 저장합니다.

일반적으로 리눅스에서 history 파일은 아래 경로에 저장됩니다.
그리고 또 일반적으로, history 파일에는 최근 1,000개의 명령어가 저장됩니다.

1
/User명폴더/home/.bash_history

history 명령어를 입력하면

자 이제 새로운 세션에서 history 명령어를 입력하면 어떻게 될까요?
history 파일에 저장된 명령어 + 메모리에 저장된 현재 세션의 명령어가 출력됩니다.



응용과 예시

history -c : 현재 세션의 명령어 내역 삭제

1
2
3
4
5
6
7
8
9
10
11
12
$ history
>>> 1   cat /.bashrc
>>> 2   ufw start
...
>>> 165 netstat -nltp
>>> 166 history

$ history -c

$ history
>>> 1   history
>>> 어라...?

어라? 현재 세션 뿐 아니라 이전 세션에 있는 내용도 없어졌는데..?
하지만 히스토리 저장 파일을 보면, 해당 내역은 남아있습니다.

1
2
3
4
5
6
$ cat .bash_history
>>> 1   cat /.bashrc
>>> 2   ufw start
...
>>> 160 cd ./html
>>> 161 exit

history 파일에 저장되는 명령어 수 늘리고 줄이기

1
$ export HISTSIZE = 원하는 개수

history 내역 저장하기

1
$ history > 저장할/경로/파일명.txt

이는 “현재 세션에서 사용된” 즉 메모리에 저장된 명령어 내역만 저장됩니다.

사용자별로 history 파일 따로 두기

기본적으로 리눅스는 사용자별로 별도의 history 파일이 운영됩니다.
하지만, 동일한 계정에 여러 명이 동시에 작업했다면?
그러면 리눅스는 특정 세션의 명령어만을 history 파일에 저장합니다.

즉, 한 사용자의 명령어만 기록된다는 것이죠.

불가피하게 동일한 계정에 여러 사용자가 접속하면서, 각각의 history 내역이 남아야한다면?
아래와 같이 history가 저장되는 파일 경로를 다르게 두면 됩니다.

1
$ export HISTFILE="히스토리/파일/저장/경로"

실제 적용되는지 테스트를 해봅니다.

1
2
3
4
5
6
7
8
# User1 사용 내역

$ root# ll
$ root# dir
$ root# export HISTFILE="/root/.bash_history_user01"
$ root# docker ps
$ root# cat 111.log
$ root# exit
1
2
3
4
5
# User2 사용 내역

$ root# cat 222.log
$ root# export HISTFILE="/root/.bash_history_user02"
$ root# exit

위와 같이 root 계정에 동시간대에 두 명이 접속해 사용했다고 가정해봅시다.
그럴 때 각각의 명령어 내역을 저장하고 싶다면, 아래 명령어로 history 파일 저장 경로를 지정해주면 됩니다.

1
$ export HISTFILE="히스토리/파일/저장/경로"

실제 어떻게 적용되었을지 살펴봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
$ root# cat /root/.bash_history_user01
>>> 1   ll
>>> 2   dir
>>> 3   export HISTFILE="/root/.bash_history_user01"
>>> 4   docker ps
>>> 5   cat 111.log
>>> 6   exit

$ root# cat /root/.bash_history_user02
>>> 1   cat 222.log
>>> 2   export HISTFILE="/root/.bash_history_user02"
>>> 3   exit

성공!



Reference

https://jhnyang.tistory.com/306#google_vignette
직접 실험 그리고 chatgpt