오늘 나는 내 bash 기록이 완전히 지워진 것을 발견했습니다. 파일을 실행 history -c
하거나 삭제 하지 않았습니다 .bash_history
. .bash_history
파일 삭제 외에 history -c
bash 기록을 지우는 방법은 무엇입니까 ?
답변1
동시에 여러 bash 인스턴스를 닫을 때 기록이 지워질 수 있는 알려진 경쟁 조건이 있습니다. 이는 bash 기록 파일을 작성할 때 잠금이 사용되지 않기 때문에 발생합니다.
Chet Ramey (현재 bash 관리자)가 제공했습니다.좋은 요약이 질문의 조건은 다음과 같습니다.
현재(bash-4.3-devel) 코드는 오류가 없다고 가정하여 다음과 같이 작동합니다(lib/readline/histfile.c:history_do_write()):
- 이름 바꾸기(히스트파일, 히스트파일~)
- O_CREAT|O_TRUNC를 사용하여 파일을 엽니다.
- malloc 버퍼는 모든 기록 데이터를 담을 수 있을 만큼 충분히 큽니다.
- 한 번의 write(2) 호출로 모든 기록 항목 쓰기
- 파일 닫기
- 연결 해제(히스트파일~)
bash-4.2 코드는 기록 파일을 백업하지 않는다는 점을 제외하면 동일한 방식으로 작동합니다. 각 쉘은 종료 시 동일한 작업을 수행하며, histappend가 설정되지 않았다고 가정합니다(구성에서 알 수 있듯이).
히스토리 파일의 길이가 0이 되는 상황은 여러 가지가 있습니다. 즉, malloc이 실패하거나 쓰기가 실패할 수 있습니다. bash-4.2에서는 이 시점에서 잘린 기록 파일로 작업을 수행하기에는 너무 늦었습니다. bash-4.3에서는 이전 기록 파일이 복원됩니다.
이 메일링 리스트 주제Bug-bash에서 문제, 가능한 해결 방법 및 이 문제와 관련된 우려 사항에 대한 적절한 토론이 포함되어 있습니다.
다른 가능성도 있습니다:
- 어떤 시점에서
HISTSIZE
or는HISTFILESIZE
0으로 설정됩니다. - 어떤 시점에서 readline은
history-size
0으로 설정됩니다. - 누군가 의도적으로 또는 의도하지 않게 (
> "$HISTFILE"
또는 유사한 수단을 통해) bash 기록을 지웠습니다.
후자의 경우, 누군가가 귀하의 계정에 액세스하지 않았는지, 대략적인 방법으로 자신의 흔적을 숨기려고 하는지 확인하고 싶을 수 있습니다. 설치한 프로세스 회계 및/또는 감사 소프트웨어가 있는 경우 (또는 CentOS/RHEL에서) 검토하십시오 last
./var/log/auth
/var/log/secure
답변2
실수로 bash 기록을 삭제한 방법:
나는 첫 번째 원칙에 따라 내 자신의 대체 터미널 readline 스크립트를 굴렸습니다.https://tiswww.cwru.edu/php/chet/readline/rluserman.html
그런 다음 터미널에서 테스트하십시오. GNU Readline에는 기록 크기 및 기록 저장 지침이 내장되어 있으므로 모든 기록이 지워지도록 기록 크기를 기본값으로 설정할 수 있습니다.
메모리에 보관된 경우 기록 복원:
재부팅하기 전에 캡처하거나, 삭제하기 전에 터미널을 열어 둔 경우 메모리에서 기록을 찾을 수 있습니다. history | cut -c 8- > histback_user1.txt
열려 있는 모든 터미널과 모든 사용자에 대해 실행됩니다. 확장 기록이 포함된 파일이 생성되면 ~/.bash_history
로 바꿀 수 있습니다 histback_user1.txt
. 또한 최근 시스템에 로그인한 모든 사용자의 기록과 루트 기록을 확인할 수 있습니다. 많은 상황에서 실수로 bash 기록을 지우는 것은 쉽습니다. 따라서 기록이 손실되지 않도록 하려면 일일 백업 스크립트가 필요합니다.