2011-08-25 5 views
5

호기심 때문에 Bash 스크립트가 Bash/SSH 세션에서 실행되는 모든 명령을 기록 할 수 있는지 궁금합니다. 나는 history이 모든 명령 실행을 로그한다고 가정하지만, 매우 신뢰할 수없는 것 같습니다!Bash Command Logger

나는 오늘 아침을 망쳤으며 사용자가 터미널에서 실행하지만 모든 명령을 올바르게 실행하지 않는 다음 bash 스크립트를 만들었습니다.

prompt_read() { 
    echo -n “$(whoami)@$(hostname):$(pwd)~$ “ 
    read userinput 
} 

prompt_read 

while :; do 
    if [[ $userinput != exit ]]; then 
    logger "logit $userinput" 
    bash -c "$userinput" 
    prompt_read 
    else 
    kill -1 $PPID 
    fi 
done 

history

건배

답변

8

역사는 당신에게 신뢰할 수없는 것 같다 그것은 단지의 끝에서 역사를 기록하기 때문에입니다 이유는보다 안정적으로 더 많은 명령을 기록 것을 알고 누구인가 BASH 세션에서 명령을 잃을 수도 있습니다. 역사를 만들 것입니다 귀하의 PROMPT_COMMANDhistory -a로 설정,

HISTFILESIZE=10000 # how many lines of history to store in the history file 

HISTSIZE=10000 # how many lines of history to store in a session (I think) 

HISTCONTROL=ignoredups # ignore duplicate commands 

shopt -s histappend # append history, rather than having sessions obliterate existing history 
PROMPT_COMMAND="history -a;$PROMPT_COMMAND" 

마지막으로 몇 가지 중요한 것들보다는 사후 세션보다 즉시 추가 :

는 내 bash는 프로필에 몇 가지가 있습니다. 그리고 shopt -s histappend을 설정하면 bash 세션이 기존 히스토리를 겹쳐 쓰지 않고 히스토리 파일에 추가하게됩니다.

일부 추가 정보를 원하시면이 당신에게 유용 경우 http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

는 또한, 당신이 HISTFILE 환경 변수와 특정 bash는 세션에 사용할 기록 파일의 이름을 변경할 수 있습니다.

+1

+1, btw, 날짜 기록 파일 당 'HISTFILE'을 (를) 설정할 수도 있습니다. – Hasturkun

+0

@Hasturkun - 언급 해 주셔서 고맙습니다. – birryree

4

체크 아웃 스크립트 http://bashshell.net/commands/using-the-script-command/

그것은 파일에 터미널에 표시되며, IIRC가 기록 된 세션을 재생할 수있는 모든 것을 기록합니다.

로그인시 모든 것을 기록하도록 사용자 쉘로 설정할 수 있습니다.

+0

재생하려면 ['scriptreplay'] (http://manpages.ubuntu.com/manpages/intrepid/man1/scriptreplay.1.html)이 필요합니다. – birryree

2

here 스크립트를 사용하면 패치 또는 특수 실행 도구를 사용하지 않고도 'bash'명령/builtins를 모두 텍스트 파일이나 'syslog'서버에 기록 할 수 있습니다.

syslog없이 로그 파일에 직접 쓸 수도 있습니다.

'bash'초기화시 한 번 호출해야하는 간단한 셸 스크립트이므로 배포가 매우 쉽습니다.