Jawaban:
Saat menutup beberapa instance bash pada saat yang sama, ada kondisi ras yang diketahui yang dapat menyebabkan riwayat dihapus. Ini terjadi karena tidak ada penguncian yang digunakan ketika file riwayat bash ditulis.
Chet Ramey (pengelola bash saat ini) memberikan ringkasan yang bagus tentang kondisi untuk masalah ini:
Kode saat ini (bash-4.3-devel) berfungsi seperti ini, dengan asumsi tidak ada kesalahan (lib / readline / histfile.c: history_do_write ()):
- ganti nama (histfile, histfile ~)
- buka file dengan O_CREAT | O_TRUNC
- malloc buffer cukup besar untuk menampung semua data histori
- tulis semua entri riwayat dalam satu panggilan (2) panggilan
- tutup file
- batalkan tautan (histfile ~)
Kode bash-4.2 bekerja dengan cara yang sama kecuali bahwa itu tidak membuat cadangan file histori. Setiap shell melakukan hal yang sama ketika keluar, dengan asumsi histappend tidak diatur, seperti pada konfigurasi Anda.
Ada beberapa cara file histori dapat berakhir nol panjang: malloc bisa gagal, atau penulisan bisa gagal. Di bash-4.2, sudah terlambat untuk melakukan apa pun tentang file histori terpotong pada saat itu. Di bash-4.3, file riwayat sebelumnya akan dipulihkan.
Utas milis ini dari bug-bash berisi diskusi yang layak tentang masalah, kemungkinan solusi, dan masalah seputar ini.
Ada juga beberapa kemungkinan lain:
HISTSIZE
atau HISTFILESIZE
diatur ke 0history-size
disetel ke 0> "$HISTFILE"
atau serupa)Dalam kasus terakhir, Anda mungkin ingin memeriksa bahwa seseorang belum mengakses akun Anda dan mencoba menyembunyikan jejak mereka dengan cara yang kasar. Lihatlah last
, /var/log/auth
(atau /var/log/secure
pada CentOS / RHEL), dan jika Anda memilikinya, semua proses akuntansi dan / atau perangkat lunak audit yang mungkin telah Anda instal.
Bagaimana saya tidak sengaja menghapus riwayat pesta saya:
Saya memutar skrip readline terminal alternatif saya sendiri dari prinsip pertama: https://tiswww.cwru.edu/php/chet/readline/rluserman.html
dan kemudian mengujinya di terminal. GNU Readline memiliki ukuran sejarah dan instruksi pelestarian sejarah yang terpasang di dalamnya, sehingga ukuran hist dapat di-default, dan dengan demikian semua riwayat Anda terhapus.
Pemulihan sejarah jika dibiarkan dalam memori:
Jika Anda menangkapnya sebelum reboot, atau jika terminal dibiarkan terbuka dari sebelum clear, Anda mungkin dapat menemukan riwayat Anda dalam memori. Jalankan history | cut -c 8- > histback_user1.txt
pada semua terminal yang dibiarkan terbuka dan untuk setiap pengguna. Jika itu menghasilkan file dengan histori panjang Anda, maka Anda dapat menggantinya ~/.bash_history
dengan histback_user1.txt
. Periksa juga riwayat semua pengguna yang baru-baru ini masuk ke sistem serta riwayat root. Sangat mudah untuk secara tidak sengaja menghapus riwayat bash dalam banyak keadaan, jadi jika Anda ingin memastikan tidak ada kehilangan riwayat, Anda memerlukan skrip cadangan harian.
>.bash_history
. Mungkin seseorang ada di akun Anda dan mencoba menyembunyikan jejaknya. Periksa waktu masuk yang tidak biasa denganlast
, cari melalui/var/log/auth.log
(tergantung pada sistem Anda).