나는 bash를 통해 내가 가장 많이 실행하는 프로그램을 셀 수 있기를 원합니다. bash에 일종의 후크를 삽입하여 bash가 수행하는 모든 작업을 기록하는 방법이 있습니까?
단순히 bash 기록 파일을 보는 것만으로는 충분하지 않습니다. 기록의 각 줄에서 첫 번째 토큰을 인쇄할 수 있지만 파이프 및 프로세스 교체는 수행되지 않습니다. 나는 다음을 원합니다 :
$ ls /usr/bin/* | fgrep $(echo grep)
ls
, fgrep
, 및 실행을 각각 한 번씩 기록합니다 echo
. 그리고 다음:
$ for file in /usr/bin/*; do stat $file; echo $file; done
주의를 기울이고 stat
달려야 합니다 echo
. Bash 흐름 제어 문 이므로 for
기록되지 않습니다.
쉘 내장 기능과 함수를 기록해야 하는지 여부는 논쟁의 여지가 있습니다(아마도 해당 내용만). 위의 예에서는 하나 이상의 런 루프를 기록해야 하는지 stat
여부 echo
도 논란의 여지가 있습니다 . 하지만 가장 간단한 방법으로 출력을 처리할 수 있습니다.
Bash를 실행하면 프로세스에 연결 하고 진행 상황을 기록 -x
하는 내부 메커니즘이 있음을 알 수 있습니다 . exec
들어갈 수 있는 다른 방법은 없나요?
답변1
첫 번째로,
strace -e execve -b execve -f -qqv -e signal='!all' bash
스모크 테스트를 사용하지 않는 경우 stderr를 일부 로거 파이프로 리디렉션하거나 strace의 파일을 사용하여 일부 엉터리 디렉토리를 버려야 합니다 -o
.-o ~/commandtraces/$(date +%Y%m%d%H%M%S).$$
모든 대화형 쉘에 대해 이를 수행하려면 재귀를 방지하기 위한 가드 변수가 필요하다고 생각합니다 .bashrc
.
답변2
로컬 시스템이고 매우 주의를 기울이면 모든 /usr/bin 파일을 래퍼로 바꿀 수 있습니다.
그것은 마치
cp -pr /usr/bin /usr/orgbin
cd /usr/bin
for f in *; do
echo "/usr/orgbin/echo $f used >> /tmp/bin_usage.out" > $f
chmod +x $f
done
먼저 무해한 프로그램 2개를 사용해 볼까요?
답변3
PROMPT_COMMAND
후크를 사용하여 입력한 마지막 명령을 기록하는 내용을 삽입 할 수 있습니다 . 이 로그는 명령을 사용하여 생성할 수 있습니다 logger
.
그것은 마치export PROMPT_COMMAND="logger `history 1`"