bash history 다루기

시스템을 다루는 모든 개발자와 운영자는 자신이 입력한 커맨드가 언젠가 필요할 수 있음을 직감한다. 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 설정 강제
  • 명령어 분석 결과를 기반으로 내부 작업 자동화 가능
  • 히스토리는 “로그가 곧 보안”이라는 개념으로 접근해야 한다

참고

답글 남기기