시스템을 다루는 모든 개발자와 운영자는 자신이 입력한 커맨드가 언젠가 필요할 수 있음을 직감한다. bash history는 그러한 순간을 위해 존재한다. 단순한 명령 기록 이상의 도구로 bash history를 적극적으로 활용해 보자.
Bash History 기본 개념
bash
는 사용자가 터미널에서 실행한 명령어를 기록하는 기능을 제공한다. 이를 통해 과거에 어떤 명령을 실행했는지 추적할 수 있으며, 반복 작업을 줄일 수 있는 유용한 수단이 된다.
$ history
위 명령으로 현재 세션의 명령 기록을 확인할 수 있다.
.bash_history
파일 구조
대부분의 시스템에서는 사용자의 홈 디렉토리에 .bash_history
파일이 존재한다:
$ cat ~/.bash_history
이는 사용자가 logout하거나 shell을 종료할 때까지 buffer에 저장되었다가 flush되며, 기본적으로 타임스탬프는 포함되지 않는다.
환경 변수 설정
HISTFILE
히스토리가 저장되는 실제 파일을 지정한다.
export HISTFILE=~/.bash_history
HISTSIZE
현재 메모리에 유지할 history의 수.
export HISTSIZE=1000
HISTFILESIZE
파일에 저장할 수 있는 최대 라인 수.
export HISTFILESIZE=2000
HISTCONTROL
히스토리에 어떤 항목을 저장할지 제어한다.
ignoredups
: 중복된 명령 무시ignorespace
: 공백으로 시작한 명령은 무시ignoreboth
: 위 둘 다 적용
export HISTCONTROL=ignoreboth
HISTIGNORE
지정한 패턴의 명령은 히스토리에 저장하지 않는다.
export HISTIGNORE="ls:cd:exit"
히스토리 파일 실시간 기록
기본적으로 bash는 세션 종료 시점에만 .bash_history
에 기록한다. 이를 실시간으로 기록하도록 하려면 다음과 같이 설정한다.
export PROMPT_COMMAND='history -a'
또는 세션마다 .bashrc
나 .bash_profile
에 추가해두면 된다.
중복 제거 및 포맷 지정
중복 제거
중복 명령어를 히스토리 파일에서 제거하려면 다음 옵션 사용:
export HISTCONTROL=erasedups
shopt -s histappend
타임스탬프 추가
히스토리에 실행 시각을 함께 기록하려면:
export HISTTIMEFORMAT="%F %T "
예:
$ history
1001 2025-05-20 00:11:15 ls -al
명령 기록 자동 보안 강화
root 계정 혹은 민감한 작업을 수행하는 계정에 대해 bash history를 감사 로깅 용도로 사용할 수 있다.
예: 변경불가 파일로 관리
chmod 600 ~/.bash_history
chattr +a ~/.bash_history # append only
예: sudo 사용 시 이력 기록
/etc/sudoers
에서 로그 기록 강화:
Defaults log_input,log_output
또는 tty log를 함께 활용하는 것도 가능.
다중 사용자 히스토리 관리
다중 사용자가 존재하는 시스템에서는 다음과 같은 설정을 통해 히스토리를 사용자 별/세션 별로 나눠 저장할 수 있다.
export HISTFILE=~/.bash_history.$(date +%Y%m%d_%H%M%S)_$$
혹은 bash logout 시점에 히스토리를 분리 백업하는 스크립트를 crontab 또는 logout hook으로 자동화할 수도 있다.
히스토리 분석 및 시각화
명령어 빈도 분석
history | awk '{CMD[$2]++} END {for(a in CMD) print CMD[a] " " a}' | sort -rn | head
시간대별 분석 (타임스탬프 설정되어 있을 경우)
awk '{print $2}' ~/.bash_history | cut -d: -f1 | sort | uniq -c
시각화 예시 (gnuplot 사용)
awk '{print $2}' ~/.bash_history | cut -d: -f1 | sort | uniq -c > hist_time.dat
gnuplot -e "set terminal png; set output 'history_by_hour.png'; plot 'hist_time.dat' using 2:1 with boxes title 'Command per Hour'"
히스토리 백업 및 버전 관리
.bash_history
파일을 git
등으로 주기적으로 백업하면 장기적인 로그 감사가 가능하다.
cd ~
git init
git add .bash_history
git commit -m "Initial bash history"
주기적 자동 백업 스크립트 예:
#!/bin/bash
cd ~
history -a
git add .bash_history
git commit -m "Update bash history $(date)"
실전 예제
A. 실수 방지
export HISTCONTROL=ignoredups
alias rm='rm -i'
B. 특정 키워드 삭제
history | grep secret_command
history -d <라인 번호>
또는 파일에서 직접 제거:
sed -i '/secret_command/d' ~/.bash_history
C. 히스토리 기반 자동화
자주 쓰는 명령어를 alias 또는 script로 자동화 가능.
alias mylog='grep "journalctl" ~/.bash_history'
결론 및 실무 팁
.bashrc
또는.bash_profile
에 기본 설정 추가해 두기- 민감한 서버의 경우 실시간 로깅 및 append-only 설정 강제
- 명령어 분석 결과를 기반으로 내부 작업 자동화 가능
- 히스토리는 “로그가 곧 보안”이라는 개념으로 접근해야 한다