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?

Jan Vorcak
sumber
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

kamu-punkt
sumber
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!)

Miquel
sumber
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
36
echo "discreet";history -d $(history 1)
John Doe
sumber
4
Ooh, kontrol per perintah? Bagus.
Kyle Strand
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

Rangaraj KS
sumber
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

Basile Starynkevitch
sumber
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.

Kristen
sumber
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!

drkvogel
sumber
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.

Cédric ROYER
sumber
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."'
Rotareti
sumber
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).

hal
sumber
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
cnd
sumber
0

Anda hanya perlu menjalankan:
$ set +o history

Untuk melihat lebih banyak, jalankan:
$ man set

Igor Santos
sumber
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>
RAVI THEJA
sumber