요구 사항은 명령을 실행하는 동안 특정 명령 날짜 및 시간이 포함된 파일에 명령줄 기록을 캡처하는 것입니다.
아래 스크립트는 날짜 및 시간과 함께 기록을 캡처하지만 현재 날짜 및 시간을 이전 명령에 할당합니다. 또한 기록 출력 파일의 증분 백업을 수행하도록 스크립트를 확장하고 싶습니다.
#!/bin/bash
. ~/.bash_profile
HISTFILE=~/.bash_history
set -o history
history >/home/user/hist_`date "+%d%b%y%T"`
답변1
정확히 원하는 것은 아니지만 bash
기록의 모든 줄에 타임스탬프를 자동으로 추가할 수 있습니다. 다음과 같은 간단한 설정:
HISTTIMEFORMAT="%d%b%y%T "
history
명령매개변수 없음그러면 기록 항목이 다음과 같이 표시됩니다.
23Jul1515:48:14 ls -ld .
그러나 이 history -w
명령은 항상 기록 파일에 기록됩니다.내부 형식으로의:
#1437659315
ls -ld .
즉, 두 줄의 첫 번째 줄에는 #
명령과 혼동되지 않도록 "기원"(즉, 1970년 1월 1일) 이후의 시간을 초 단위로 표시하고 앞에 a를 붙입니다.
답변2
Bash에는 각 명령의 타임스탬프를 기록하도록 Bash에 지시하는 옵션이 있습니다. 환경 변수에 유용한 값을 할당하면 이를 수행할 수 있습니다 HISTTIMEFORMAT
. bash
맨페이지 에서 :
이 변수가 설정되고 비어 있지 않은 경우 해당 값은
strftime(3)
내장 기록에 의해 표시되는 각 기록 항목과 관련된 타임스탬프를 인쇄하기 위한 형식 문자열로 사용됩니다. 이 변수가 설정되면 타임스탬프가 기록 파일에 기록되어 셸 세션 전체에서 지속될 수 있습니다. 이는 기록 주석 문자를 사용하여 타임스탬프를 다른 기록 줄과 구별합니다.
HISTTIMEFORMAT
활성화 후에 는 ~/.bash_history
기록된 각 명령에 대해 항상 두 줄이 있습니다.
- 첫 번째 줄은 파운드 "#" 기호로 시작하고 그 뒤에 Unix 타임스탬프(Unix 시대가 시작된 이후의 초 수)가 옵니다.
- 두 번째 줄은 입력한 명령입니다.
#1671097644 cd ~/bin #1671097645 ls -l
내 환경에서는
HISTTIMEFORMAT="%s (%H:%M:%S):"
도구를 호출하면 history
정의한 형식을 사용하여 타임스탬프의 형식이 동적으로 지정됩니다. 나는 명령을 쉽게 정렬하고( %s
타임스탬프는 초 단위임) 읽기 쉽게 위의 형식을 사용합니다 . 내 셸에서 를 입력하면 history
다음과 같은 내용이 표시됩니다.
3 1437664568 (17:16:08):man bash
4 1437664699 (17:18:19):history
노트:타임스탬프 로깅을 활성화하기 전의 모든 명령은 접두사가 붙은 타임스탬프 줄이 없는 단순한 명령입니다. 따라서 현재 세션에 로그인한 날짜/시간 스탬프가 표시됩니다. 이것이 귀찮다면 이전 행을 찾아 교체하고 인위적인 타임스탬프를 앞에 추가하세요. 그리고 기록 보관을 위해 경계선에 메모를 추가하세요. 이와 같이:
#1671058800
ls -l
#1671058800
exit
#1671094600
echo Activated timestamp recording in the history file now.
#1671094610
echo All commands prior got the artificial timestamp 2022-12-15 00:00:00 (1671058800).
#1671094622
cd /
#1671094627
exit
편집: 운영자의 질문에 완전히 답변되지 않았습니다.
또한 기록 출력 파일의 증분 백업을 수행하도록 스크립트를 확장하고 싶습니다.
기록 파일의 "증분 백업"이 무엇을 의미하는지 잘 모르겠습니다. 어쩌면 정기적으로 기록을 백업하고 싶을 수도 있습니다. 취할 수 있는 접근 방식은 여러 가지가 있습니다.
- PROMPT_COMMAND 변수를 설정하여
history -a
각 호출 후(로그아웃을 기다리는 대신) 명령 기록을 지속적으로 업데이트합니다. - DEBUG 신호를 캡처하기 위해 정의한 함수를 사용하십시오. 이 함수는 명령이 입력될 때마다 호출됩니다. 함수 안에서는 무엇이든 할 수 있습니다. (PROMPT_COMMAND보다 약간 더 안정적입니다.)
- cronjob은 기록 파일을 주기적으로 복사/보관합니다.