Điều gì có thể khiến lịch sử bash của tôi bị xóa bất ngờ?


16

Hôm nay tôi nhận thấy rằng lịch sử bash của tôi bị xóa hoàn toàn. Tôi đã không thực hiện history -ccũng không xóa các .bash_historytập tin. Ngoài việc xóa các .bash_historytập tin và history -c, làm thế nào có thể xóa lịch sử bash?


2
Nó có thể xảy ra bằng ví dụ >.bash_history. Có thể ai đó đã ở trong tài khoản của bạn và cố gắng che giấu dấu vết của anh ta. Kiểm tra thời gian đăng nhập bất thường với last, tìm kiếm thông qua /var/log/auth.log(tùy thuộc vào hệ thống của bạn).
ott--

Câu trả lời:


17

Khi đóng nhiều trường hợp bash cùng một lúc, có một điều kiện chủng tộc đã biết có thể khiến lịch sử bị xóa. Điều này xảy ra vì không có khóa được sử dụng khi tệp lịch sử bash được viết.

Chet Ramey (người duy trì bash hiện tại) đã đưa ra một bản tóm tắt tốt về các điều kiện cho vấn đề này:

Mã hiện tại (bash-4.3-devel) hoạt động giống như thế này, giả sử không có lỗi (lib / readline / histfile.c: history_do_write ()):

  • đổi tên (histfile, histfile ~)
  • mở tệp bằng O_CREAT | O_TRUNC
  • bộ đệm malloc đủ lớn để chứa tất cả dữ liệu lịch sử
  • viết tất cả các mục lịch sử trong một cuộc gọi viết (2)
  • Đóng tập tin
  • hủy liên kết (histfile ~)

Mã bash-4.2 hoạt động theo cách tương tự ngoại trừ việc nó không sao lưu tệp lịch sử. Mỗi shell làm điều tương tự khi nó thoát, giả sử histappend không được đặt, như trong cấu hình của bạn.

Có một số cách mà tệp lịch sử có thể kết thúc bằng không: malloc có thể thất bại hoặc ghi có thể thất bại. Trong bash-4.2, đã quá muộn để làm bất cứ điều gì về tệp lịch sử bị cắt ngắn tại thời điểm đó. Trong bash-4.3, tệp lịch sử trước đó sẽ được khôi phục.

Chủ đề danh sách gửi thư từ bug-bash này chứa một cuộc thảo luận tốt về các vấn đề, giải pháp có thể và mối quan tâm xung quanh vấn đề này.

Ngoài ra còn có một số khả năng khác:

  • Tại một số điểm, của bạn HISTSIZEhoặc HISTFILESIZEđược đặt thành 0
  • Tại một số điểm, đường đọc của bạn history-sizeđược đặt thành 0
  • Ai đó, dù cố ý hay vô ý, đã xóa sạch lịch sử bash (thông qua > "$HISTFILE"hoặc tương tự)

Trong trường hợp sau, bạn có thể muốn kiểm tra xem ai đó đã truy cập vào tài khoản của bạn và đang cố gắng che giấu dấu vết của họ một cách thô thiển. Hãy xem last, /var/log/auth(hoặc /var/log/securetrên CentOS / RHEL), và nếu bạn có nó, bất kỳ phần mềm kế toán và / hoặc kiểm toán nào bạn có thể đã cài đặt.


1

Làm thế nào tôi vô tình xóa lịch sử bash của tôi:

Tôi đã cuộn tập lệnh đọc thiết bị đầu cuối thay thế của riêng mình từ các nguyên tắc đầu tiên: https://tiswww.cwru.edu/php/chet/readline/rluserman.html

và sau đó thử nghiệm nó trong một thiết bị đầu cuối. GNU Readline có kích thước lịch sử và hướng dẫn bảo tồn lịch sử được xây dựng, do đó kích thước lịch sử có thể được mặc định và do đó tất cả lịch sử của bạn sẽ bị xóa bỏ.

Phục hồi lịch sử nếu để lại trong bộ nhớ:

Nếu bạn bắt được nó trước khi khởi động lại, hoặc nếu một thiết bị đầu cuối bị mở từ trước khi xóa, bạn có thể tìm thấy lịch sử của mình trong bộ nhớ. Chạy history | cut -c 8- > histback_user1.txttrên tất cả các thiết bị đầu cuối còn mở và cho mọi người dùng. Nếu điều đó tạo ra một tập tin với lịch sử mở rộng của bạn, thì bạn có thể thay thế ~/.bash_historybằng histback_user1.txt. Đồng thời kiểm tra lịch sử của tất cả người dùng gần đây đã đăng nhập vào hệ thống cũng như lịch sử của root. Thật dễ dàng để vô tình xóa lịch sử bash trong nhiều trường hợp, vì vậy nếu bạn muốn chắc chắn không mất lịch sử, bạn cần một kịch bản sao lưu hàng ngày.


Cảm ơn bạn . Tôi không biết chuyện quái gì đã xảy ra, nhưng lịch sử của tôi đã được đặt lại vào ngày hôm qua và mãi đến bây giờ tôi mới nhận ra điều đó. Nhưng, may mắn cho tôi, tôi không có một cửa sổ đầu cuối nào mở, mà là 10 (!). Bây giờ tất cả đều tốt.
Marc.2377
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.