Jawaban:
Anda harus keluar dan kembali atau menjalankan history -a
sehingga riwayat saat ini berkomitmen untuk disk.
Kemudian cukup edit file ~/.bash_history
.
vim ~/.bash_history
) dengan spasi; perintah yang dimulai dengan spasi biasanya tidak dicatat (lihat $HISTCONTROL
).
Anda dapat menghapus dari file histori menggunakan commandline dalam dua langkah:
history -d <line_number>
menghapus baris yang ditentukan dari riwayat di memori.history -w
menulis riwayat memori saat ini ke ~/.bash_history
file.Dua langkah bersama-sama menghilangkan garis permanen dari dalam memori sejarah dan dari Bash_history file juga.
history -w
dari riwayat?
<line_number>
hanya history | grep [unwanted_content]
untuk mendapatkan daftar dengan semua baris yang berisi [unwanted_content]
(seperti kata sandi).
Untuk mencegah perintah agar tidak ditambahkan ke riwayat, pastikan bahwa variabel lingkungan HISTCONTROL
berisi nilai yang dipisahkan dengan titik duanya ignorespace
, misalnya (tambahkan misalnya ke .bashrc
):
$ export HISTCONTROL=ignorespace
Ini akan mencegah perintah apa pun dengan ruang terkemuka ditambahkan ke histori. Anda kemudian dapat menghapus riwayat sepenuhnya dengan menjalankan
$ history -c -w
^-- additional space character
Pertama-tama, jika perintah yang akan Anda keluarkan sensitif, tidak aman, atau Anda hanya tidak membutuhkannya mengacaukan sejarah Anda, yang terbaik / tercepat untuk mencegahnya memasukkan sejarah di tempat pertama. Pastikan itu $HISTCONTROL
mengandung ignorespace
:
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Kemudian, lanjutkan perintah apa pun yang tidak Anda inginkan dalam riwayat Anda dengan spasi:
(bash)$ sensitive-cmd-with --password 82cf7dfe
(bash)$ rm -r... # One-off recursive remove; mustn't be accidentally repeated!
Jika Anda secara tidak sengaja memasukkan perintah yang tidak diinginkan ke dalam riwayat, asalkan sesi bash Anda masih terbuka, perintah tersebut belum menyentuh disk. Untuk menghapus perintah sebelumnya dalam riwayat, terbitkan:
(bash)$ history -d $((HISTCMD-1))
Perhatikan ruang terdepan; perintah ini membutuhkan ignorespace
, jika tidak, itu hanya akan menghapus sendiri!
Jika Anda ingin menghapus beberapa perintah terakhir, temukan nomor riwayat terakhir dan pertama:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn\'t-work
602 otherwise-unwanted
Dalam hal ini 602 dan 599. Kemudian terbitkan:
(bash)$ for i in {602..599}; do history -d $i; done
(Tanpa ignorespace
, itu akan menjadi 603..599.)
Jika Anda tidak ingin riwayat apa pun dari sesi Anda saat ini mengenai disk, keluar menggunakan:
(bash)$ kill -9 $$
Pendekatan sejauh ini adalah untuk tidak membiarkan item sejarah sensitif ditulis ke disk untuk keamanan tambahan, karena dalam teori data yang dihapus dari media non-volatile masih dapat dipulihkan.
Namun, jika perintah yang ingin Anda hapus berasal dari sesi sebelumnya, mereka sudah ditambahkan pada saat $HISTFILE
keluar. Memanipulasi sejarah dengan perintah di atas masih akan hanya menambahkan item baru yang tersisa ke $HISTFILE
, pada saat keluar . Untuk menimpa para $HISTFILE
dengan pandangan sesi saat ini dari seluruh sejarah, sekarang , masalah:
(bash)$ history -w
Tentu saja untuk item histori yang sudah ada di disk, alternatif untuk mengedit histori dengan history -d
perintah yang kemudian dikeluarkan history -w
, adalah mengedit $HISTFILE
dengan editor teks.
$HISTFILE
, saat keluar ." Sebenarnya, ini tidak sepenuhnya benar. Tampaknya hanya menambahkan item baru yang tersisa yang 'menonjol' dari panjang sejarah asli. Misalnya, jika saya menghapus 5 item asli dan menambahkan 15 item baru, hanya 10 item baru ditambahkan, sedangkan saya berharap semua 15 item baru ditambahkan. Saya pikir ini adalah bug karena saya tidak dapat melihat bagaimana ini merupakan fungsi yang diinginkan.
Beberapa teknik:
Jika Anda memasukkan beberapa kata sandi pada baris perintah, maka sadari bahwa semua perintah dicatat, Anda bisa:
Keluar paksa dari sesi saat ini tanpa menyimpan riwayat:
kill -9 $$
Ini akan menghapus semua riwayat saat ini.
Ketik ↑ (up arrow)sesi bash terbuka hingga informasi sensitif ditampilkan, kemudian gunakan penekanan tombol pengeditan seperti Ctrl+ Wuntuk menghapus info sensitif, dan kemudian ↓ (down arrow) sampai baris kosong baru diminta, sebelum mengetik Enter.
Jika Anda menyadari bahwa informasi sensitif sudah disimpan, dan Anda ingin menghapusnya, tetapi tidak seluruh riwayat Anda:
sed
Perintah sederhana dapat melakukan pekerjaan:
sed -e '/SeNsItIvE InFo/d' -i .bash_history
tetapi, saat Anda mengetik ini, Anda membuat garis riwayat lain yang berisi pola pencarian (info sensitif) yang Anda coba hapus. Jadi kamu bisa:
sed -e "/$(head -n1)/d" -i .bash_history
Ini akan berjalan head -n1
dengan input dari terminal. Akan terlihat bahwa terminal Anda digantung (tidak akan ada prompt); cukup ketik informasi yang ingin Anda hapus dari file. Ini adalah trik untuk membiarkan Anda memasukkan (bagian dari) perintah tanpa benar-benar mengetiknya ke dalam baris perintah, sehingga membuatnya tidak memenuhi syarat untuk dimasukkan dalam catatan sejarah. Kemudian sed
akan menggunakan teks yang Anda ketikkan untuk mencari .bash_history
dan menghapus semua baris yang berisi info sensitif. Catatan: jika pola informasi sensitif Anda berisi garis miring, Anda harus menghindarinya dengan garis miring terbalik, atau ubah sed
perintah untuk menggunakan sintaks ini untuk menentukan pembatas yang tidak muncul dalam pola:
sed -e "\|$(head -n1)|d" -i .bash_history
Cara lain bisa dengan menghapus hanya informasi sensitif, tetapi tetap memegang perintah yang berisi informasi. Untuk ini, Anda cukup mengganti informasi sensitif dengan teks pengganti pilihan Anda:
sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.
Akhirnya, untuk memastikan bahwa ini tidak akan tetap di file lain yang dilupakan:
SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
akan mendaftar semua file terkait.
find . -type f -print0 |
xargs -0 grep -l "$SENSITIVEINFO" |
tr \\n \\0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
akan mengganti semua kemunculan info sensitif di semua file di pohon direktori yang di-root di .
. Catatan: meskipun perintah ini digunakan xargs -0
, ia tidak akan menangani file dengan baris baru dalam namanya.
Temukan baris yang ingin Anda hapus dengan menekan ↑ (up arrow)sampai muncul, lalu tekan Ctrl+ U. Itu harus menghapus garis.
Jika Anda menggunakan history
perintah, Anda dapat melihat baris telah diganti dengan tanda bintang.
*
.
Jika Anda perlu menghapus beberapa baris secara bersamaan saya biasanya menggunakan ini:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
Jika Anda perlu menghapus perintah terakhir yang dapat Anda gunakan:
history -d $((HISTCMD-2))
history | grep <string>
masih menunjukkan semua baris yang diklaimnya dihapus ...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
Jika Anda perlu menghapus serangkaian garis dari riwayat, fungsi bash berikut dapat menghemat waktu Anda:
function histdel() {
[ $# -eq 1 ] && history -d "$1" && history -w
if [ $# -eq 2 -a "$1" -le "$2" ]; then
for n in `seq "$2" "$1"`; do
history -d "$n"
done
history -w
fi
}
Fungsi biasanya ditambahkan ke $HOME/.bashrc
. Untuk menggunakan fungsi imediatelly, Anda harus meminta file dibaca lagi oleh shell Anda yang berjalan ( . $HOME/.bashrc
). Kemudian untuk menghapus mis perintah 200-210 dari riwayat:
$ histdel 200 210
(Catatan: Pertanyaan ini adalah salah satu hasil pencarian teratas jika Anda mencari menghapus serangkaian perintah dari sejarah bash. Jadi, sementara pertanyaan di atas lebih dari apa yang ditanyakan, itu bisa berguna bagi beberapa pembaca.)
for
pernyataan: for n in $(seq "$2" "$1")
lebih disukai oleh sebagian orang, dan, jika seq
tidak berhasil, coba for ((n="$2"; n>="$1"; n--))
.
Coba saja ini,
$ history
ini akan menampilkan id sejarah dan perintah, mis
.
.
211 ls
212 javac Welcome.java
213 java welcome
.
.
menggunakan,
$ history -d 211
Di sini 211 adalah id sejarah. Sekarang periksa ini menggunakan
$ history
.
.
211 javac Welcome.java
212 java welcome
.
.
Saya tahu ini sudah lama sejak pertanyaan ini ditanyakan dan dijawab, tetapi saya akan menunjukkan kepada Anda metode saya untuk membersihkan file riwayat saya dan keluar pada saat yang sama.
Saya berlari :
history -w && nano "${HISTFILE}" && history -c && exit
Apa yang dilakukannya sederhana:
history -w
: menulis sejarah dalam cache "${HISTFILE}"
nano "${HISTFILE}"
: izinkan saya untuk mengedit "${HISTFILE}"
Anda dapat menggunakan skrip sed atau apa pun yang Anda ingin bersihkan"${HISTFILE}"
history -c
: hapus riwayat cache sehingga perintah terakhir ini tidak ditambahkan.exit
: logout saya tambahkan riwayat cache ... tapi kosong;)Setelah perintah itu, Anda akan keluar dengan file histori bersih. Masuk untuk memeriksa riwayat Anda;)
Saya harap ini akan membantu seseorang.