Sembunyikan "history -d" di bash history

14

Jika saya secara tidak sengaja mengetikkan kata sandi atau hal lain yang sensitif di bash, saya dapat dengan mudah menghapusnya history -d ROW#, tetapi saya selalu dibiarkan dengan history -d ROW#perintah dalam sejarah yang menunjukkan kepada semua orang bahwa seseorang memperbaiki kesalahan.

Bisakah saya menambahkan sesuatu ke perintah untuk mencegahnya muncul di bash history?

Kalle Ling
sumber

Jawaban:

27

Untuk tidak menyimpan satu perintah dalam riwayat Anda, cukup awali dengan spasi (ditandai dengan di sini):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

Perilaku ini diatur dalam ~/.bashrcfile Anda , yaitu di baris ini:

HISTCONTROL=ignoreboth

man bash mengatakan:

HISTCONTROL
Daftar nilai-nilai yang dipisahkan oleh titik dua yang mengendalikan bagaimana perintah disimpan pada daftar sejarah. Jika daftar nilai termasuk abaikan , garis yang dimulai dengan karakter spasi tidak disimpan dalam daftar riwayat . Nilai diabaikannya menyebabkan garis yang cocok dengan entri riwayat sebelumnya tidak disimpan. Nilai ignoreboth adalah singkatan untuk ignorespace dan ignoredups .

ignoredupsomong-omong adalah alasan mengapa history | tail -n2hanya muncul sekali dalam sejarah dalam tes di atas.


Riwayat terminal disimpan dalam RAM dan ~/.bash_historysegera dihapus setelah Anda menutup terminal. Jika Anda ingin menghapus entri tertentu dari Anda, ~/.bash_historyAnda dapat melakukannya dengan sed:

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

Dalam yang terakhir saya mengubah pembatas standar /untuk _seperti itu digunakan dalam istilah pencarian, sebenarnya ini sama dengan sed -i '/\/path\//d' .bash_history. Jika output perintah hanya baris yang ingin Anda hapus menambahkan -ipilihan dan perubahan !duntuk dmelakukan penghapusan:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere
pencuci mulut
sumber
12

Salah satu caranya adalah dengan mengatur HISTIGNOREvariabel lingkungan. Dariman bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW, ini adalah default HISTCONTROLyang menyediakan solusi tipe-a-space-in-front].

Jadi misalnya

HISTIGNORE='history -d*'

Jika Anda ingin terus-menerus, ekspor dari Anda ~/.bashrc

export HISTIGNORE='history -d*'
Steeldriver
sumber
6

Kamu bisa

  • Tutup jendela terminal . Ini akan menghapus sejarah terkini di jendela terminal yang Anda tutup terbaru (setelah jendela lain ditutup) ke dalam file/home/$USER/.bash_history

  • Edit file/home/$USER/.bash_history tanpa melibatkan bash, misalnya dengan memulai editor favorit Anda melalui Alt+F2

    Dengan cara ini Anda dapat memeriksa seluruh riwayat dan menghapus perintah apa pun, yang tidak Anda inginkan lagi di sana.

    masukkan deskripsi gambar di sini

    masukkan deskripsi gambar di sini

sudodus
sumber
1

Saya biasanya menggunakan:

history -w; history -c; $EDITOR $HISTFILE; history -r

File histori ditulis ke disk, dihapus dalam memori, Anda mengeditnya untuk melakukan apa yang Anda inginkan, dan kemudian file histori yang Anda edit dibaca kembali.

Perhatikan bahwa jika editor Anda menyimpan file cadangan, kata nakal mungkin masih muncul di disk.

Opsi lain yang digunakan -dadalah dengan menggunakan nomor riwayat prediksi:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

Dalam contoh ini, saya menghapus hal buruk, saya menghapus perintah untuk mendapatkan nomor riwayat, dan kemudian saya menghapus perintah yang saya gunakan untuk menghapus riwayat. Semuanya dibersihkan kemudian.

Seth Robertson
sumber
0

Jika Anda ingin menjalankan perintah tanpa menyimpannya dalam sejarah, tambahkan itu dengan ruang tambahan

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Agar ini berfungsi, Anda perlu mengabaikan atau mengabaikan di HISTCONTROL. Misalnya, jalankan

HISTCONTROL = ignorespace Untuk membuat pengaturan ini tetap ada, letakkan di .bashrc Anda.

bkdroid13
sumber