Jalankan perintah tanpa menyimpannya dalam riwayat [tertutup]


203

Saya ingin menjalankan beberapa perintah tetapi tidak ingin menyimpannya dalam sejarah perintah. Sehingga tak seorang pun akan dapat mencarinya di .bash_historyfile.

Apakah ada cara bagaimana menjalankan perintah bash dengan cara ini?


13
Pertanyaan ini mungkin harus dipindahkan ke ServerFault karena ini bukan "pemrograman" sebanyak "admin server" - tetapi terima kasih atas pertanyaan / jawaban, tepat apa yang saya butuhkan!
— Andrew Theken

Jawaban:


294

Mulai perintah Anda dengan spasi dan itu tidak akan dimasukkan dalam sejarah.

Ketahuilah bahwa ini memerlukan variabel lingkungan $HISTCONTROLuntuk diatur.

  • Periksa apakah perintah berikut mengembalikan ignorespaceatau ignoreboth

    #> echo $HISTCONTROL
  • Untuk menambahkan variabel lingkungan jika tidak ada, baris berikut dapat ditambahkan ke profil bash. Misalnya%HOME/.bashrc

    export HISTCONTROL=ignorespace

Setelah sumber profil lagi perintah ruang awalan tidak akan ditulis $HISTFILE


20
Ini tidak berfungsi kecuali ignorespace termasuk dalam $ HISTCONTROL - walaupun ini mungkin merupakan default pada kebanyakan sistem.
— pgl

2
Benar. Untuk lebih jelasnya OP harus melihat HISTCONTROL dan HISTIGNORE di halaman bash man.
— u-punkt

2
thegeekstuff.com/2008/08/... - lebih banyak tip bash history tersedia di sini termasuk metode menyembunyikan perintah dari history
— user379997

52

Di setiap sesi Bash yang diberikan, setel file riwayat ke / dev / null dengan mengetik:

export HISTFILE=/dev/null

Perhatikan bahwa, sebagaimana ditunjukkan dalam komentar, ini tidak akan menulis perintah apa pun di sesi itu ke riwayat!

Hanya saja, jangan main-main dengan kerja keras administrator sistem Anda, tolong;)

Solusi Doodad lebih elegan. Cukup atur variabel: unset HISTFILE(terima kasih!)


5
Ini akan mencegah semua perintah untuk dicatat. Bukan itu yang diinginkan si penanya.
— Noufal Ibrahim

12
Ini menyebabkan masalah bagi saya terkait dengan /dev/nullizin yang diatur ke 0600 pada saat logout. Sebaliknya saya menggunakan unset HISTFILE.
— Doodad


21

Perpanjangan dari jawaban @John Doe & @ user3270492. Tapi, ini sepertinya berhasil untukku.

<your_secret_command>; history -d $((HISTCMD-1))

Anda seharusnya tidak melihat entri perintah dalam riwayat Anda.

Inilah penjelasannya ..

'History -d' menghapus entri yang disebutkan dari histori.

HISTCMD menyimpan nomor perintah dari yang akan dieksekusi selanjutnya. Jadi, (HISTCMD-1) mengacu pada perintah yang dieksekusi terakhir.

Hapus baris tertentu dari file Bash history


Sayangnya ini tidak berhasil untuk saya.
— Magick

10

Anda mungkin mempertimbangkan menggunakan shell tanpa histori, seperti mungkin

/bin/sh << END
   your commands without history
END

(mungkin /bin/dashatau /bin/sashbisa lebih tepat daripada /bin/sh)

atau bahkan lebih baik menggunakan utilitas batch mis

batch << EOB
   your commands
EOB

Sejarah akan berisi shatau batchyang tidak terlalu berarti


8

Anda dapat memulai sesi Anda dengan

export HISTFILE=/dev/null ;history -d $(history 1)

kemudian lanjutkan dengan perbuatan licik Anda. Mengatur histfile agar /dev/nullakan dicatat ke file histori, namun entri ini akan segera dihapus dan tidak ada jejak (setidaknya dalam file histori) akan ditampilkan.

Juga, ini tidak permanen.


Ini sudah dijawab berkali-kali. Apa yang akan Anda katakan jawaban Anda ditambahkan ke utas ini (kecuali untuk kebisingan yang tidak berguna)?
— gniourf_gniourf

Itu tidak disatukan dalam satu jawaban , sehingga tidak memiliki perintah itu sendiri muncul dalam sejarah dan tidak memiliki apa pun muncul yang dimasukkan sesudahnya.
— Christian

1
Tapi sekarang utas ini benar-benar berantakan! dalam hal ini, terutama untuk pertanyaan lama seperti itu, saya yakin lebih baik Anda mengedit jawaban yang sudah ada, dan / atau memberikan komentar ...
— gniourf_gniourf

5

Seperti yang disebutkan oleh Doodad dalam komentar , unset HISTFILEmelakukan ini dengan baik, tetapi jika Anda juga ingin juga menghapus beberapa riwayat, lakukan echo $HISTFILEuntuk mendapatkan lokasi file riwayat (biasanya ~/.bash_history) unset HISTFILE, dan edit ~/.bash_history(atau apa pun HISTFILEitu - tentu saja sekarang unsetsehingga Anda dapat ' t membacanya).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Kemudian Anda telah mengedit riwayat Anda, dan fakta bahwa Anda telah mengeditnya!


Sudah mencoba ini: GNU bash, versi 3.2.57 (1) -release (x86_64-apple-darwin15) dan tidak berfungsi. Perintah yang saya gunakan setelah HISTORY yang tidak disetel disimpan di ~ / .bash_history
— Krystian

@Krystian Kesalahan saya - saya telah menulis "unset HISTORY" padahal seharusnya "unset HISTFILE" - dikoreksi. Apakah ini berfungsi sekarang? Ini bekerja pada GNU bash, versi 4.3.30 (1) -release (x86_64-pc-linux-gnu).
— drkvogel

baik saya tidak yakin. Tes sederhana: unset HISTFILE; echo TEST; historyakan memberi Anda perintah echo TESTseperti sebelumnya ke yang terakhir. Meskipun setelah mengakhiri sesi dan terhubung lagi, sejarah tidak memiliki entri ini. Jadi saya akan mengatakan itu bekerja :)
— Krystian

unset HISTFILEtampaknya tidak menghentikan perintah yang direkam dalam riwayat dalam memori, tetapi itu menghentikan mereka yang direkam dalam file apa pun yang $ HISTFILE. Jadi saya kira Anda masih memiliki sejarah lokal di memori, tetapi tidak direkam dalam file lagi, yang mungkin Anda inginkan! ;)
— drkvogel

4

Anda juga dapat menggunakan perintah berikut:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Saya pikir itu perintah yang sangat portabel.


Saya telah membuat alias dari ini: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"dan sekarang Anda dapat melakukannya seperti ini:mysql -uroot -pSecretPassword ; forget
— sobi3ch

1
Maaf, tapi saya sadar Anda perlu membuat fungsi alih-alih alias karena tanda kutip mengubah makna $sdan hal-hal lain dalam sed. function forget() { // put code here // }
— sobi3ch

3

Jika Anda menggunakan zsh, Anda dapat menjalankan:

setopt histignorespace

Setelah ini diatur, setiap perintah yang dimulai dengan spasi akan dikecualikan dari sejarah.

Anda dapat menggunakan alias dalam .zshrcuntuk mengubah ini on / off :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

Bagus, tetapi pertanyaan ini secara khusus ditandai bash
— tripleee

2

Ada beberapa cara untuk mencapai hal ini. Ini menetapkan ukuran file riwayat ke 0:

export HISTFILESIZE=0

Ini mengatur file histori untuk /dev/null, secara efektif menonaktifkannya:

export HISTFILE=/dev/null

Untuk perintah individual, Anda bisa mengawali perintah dengan spasi dan itu tidak akan disimpan dalam file histori. Perhatikan bahwa ini mengharuskan Anda memiliki ignorespacenilai yang termasuk dalam $HISTCONTROLvariabel lingkungan (man bash dan cari ignorespacedetail lebih lanjut).


2
Ini akan mencegah semua perintah untuk dicatat. Bukan itu yang diinginkan si penanya.
— Noufal Ibrahim

Yah, saya agak berasumsi bahwa penanya akan mengatur ulang nilai setelah melakukan apa pun yang diinginkannya yang tidak boleh dicatat.
— pgl

1

Ini berguna jika Anda ingin menghapus semua sejarah, termasuk fakta bahwa Anda menghapus semua sejarah!

rm .bash_history;export HISTFILE=/dev/null;exit

0

Anda hanya perlu menjalankan:
$ set +o history

Untuk melihat lebih banyak, jalankan:
$ man set


2
Ini menonaktifkan riwayat untuk semua perintah di masa depan, bukan untuk perintah individu. Kebanyakan orang yang datang ke sini harus melihat jawaban yang diterima sebagai gantinya.
— tripleee

Ini valid, atau oke tapi tidak lengkap. Selama kita menambahkan perintah kebalikan set -x historysetelah itu, itu berfungsi.
— Abdillah

0

Perintah ini mungkin berguna. Ini tidak akan merekam perintah yang dieksekusi

history -d $((HISTCMD-1)) && <Your Command Here>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.