Yanıtlar:
history -a
Geçerli tarihin diske adanmış olması için oturumu kapatıp tekrar açmanız veya çalıştırmanız gerekir.
Sonra sadece dosyayı düzenleyin ~/.bash_history
.
vim ~/.bash_history
) bir boşlukla başlayın ; boşlukla başlayan komutlar genellikle kaydedilmez (bkz. $HISTCONTROL
).
Komut satırını kullanarak iki adımda geçmiş dosyasından kaldırmayı başarabilirsiniz:
history -d <line_number>
, bellekteki tarihteki belirli bir satırı siler.history -w
, geçerli bellek geçmişini ~/.bash_history
dosyaya yazar.İki adım birlikte kalıcı bellek satır kaldırmaktır tarih ve gelen .bash_history dosyası da.
history -w
tarihten nasıl silinir ?
<line_number>
Sadece history | grep [unwanted_content]
içeren tüm satırları içeren bir liste bulmak için [unwanted_content]
(şifreler gibi).
İçin önlemek ilk tarihin eklenen bir komut, ortam değişkeni emin olmak HISTCONTROL
kendi kolon ayrılmış değerler arasında değeri içeren ignorespace
, örneğin, (örneğin, ekleme .bashrc
):
$ export HISTCONTROL=ignorespace
Bu, öncü boşluk içeren herhangi bir komutun tarihe eklenmesini önleyecektir. Daha sonra çalıştırarak geçmişi tamamen silebilirsiniz.
$ history -c -w
^-- additional space character
Her şeyden önce, yayınlamak üzere olduğunuz komut hassas, güvensizse veya yalnızca geçmişinizi karıştırması gerekmiyorsa, yalnızca tarihe girmesini önlemek için en hızlı / en hızlı yoldur. $HISTCONTROL
İçinde bulunduğundan emin olun ignorespace
:
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Ardından geçmişinizde istemediğiniz herhangi bir komutu bir boşlukla izleyin:
(bash)$ sensitive-cmd-with --password 82cf7dfe
(bash)$ rm -r... # One-off recursive remove; mustn't be accidentally repeated!
Eğer yanlışlıkla bash oturumunuzun hala açık olması koşuluyla, tarihe istenmeyen bir komut koyarsanız, komut diske henüz dokunmamıştır. Geçmişdeki önceki komutu silmek için aşağıdakileri yapın:
(bash)$ history -d $((HISTCMD-1))
Baştaki boşluğa dikkat edin; Bu komut gerektirir ignorespace
, aksi takdirde sadece kendini siler!
Son birkaç komutu silmek istiyorsanız, son ve ilk geçmiş numaralarını bulun:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn\'t-work
602 otherwise-unwanted
Bu durumda 602 ve 599. Sonra sorun:
(bash)$ for i in {602..599}; do history -d $i; done
(Olmadan ignorespace
, 603.557 olurdu.)
Geçerli oturumunuzdaki herhangi bir geçmişi diske vurmak istemiyorsanız , şunu kullanarak çıkın:
(bash)$ kill -9 $$
Şimdiye kadarki yaklaşım, hassas tarih öğelerinin daha fazla güvenlik için diske yazılmasına bile izin vermemektir, çünkü teoride uçucu olmayan ortamlardan silinen veriler hala kurtarılabilir.
Ancak, kaldırmak istediğiniz komut (lar) önceki bir oturumdaysa, $HISTFILE
çıkışa zaten eklenmiş olacaklardır . Yukarıdaki komutlarla tarihini kurgulama hala sadece edecek eklemek kalan yeni öğeleri $HISTFILE
, çıkışta . Şu anki oturumun geçmişin tamamı hakkındaki görüşünün üzerine yazmak için $HISTFILE
şu anda sorun:
(bash)$ history -w
Tabii ki zaten diskte bulunan tarih öğeleri için, history -d
daha sonra yayınlayan komutlarla geçmişi düzenlemenin alternatifi bir metin editörüyle history -w
düzenlemektir $HISTFILE
.
$HISTFILE
, Çıkışta .” Aslında bu tam olarak doğru değildir. Sadece orijinal tarih uzunluğundan 'dışarı çıkan' yeni maddeleri ekliyor görünmektedir. Örn. 5 orijinal öğeyi kaldırır ve 15 yeni eklersem, sadece son 10 yenisi eklenir, oysa 15 yeninin de eklenmesini beklerdim. Bunun bir hata olduğunu düşünüyorum çünkü bunun nasıl istenen bir işlevsellik olduğunu göremiyorum.
Birkaç teknik:
Bir komut satırına bir şifre girdiyseniz, tüm komutların günlüğe kaydedildiğini fark edin, aşağıdakilerden birini yapabilirsiniz:
Geçmişi kaydetmeden geçerli oturumdan çıkmaya zorla:
kill -9 $$
Bu, tüm güncel geçmişi bırakacaktır.
Tür ↑ (up arrow)hassas bilgilerin kadar açık bash oturumda sonra gibi hat düzenleme tuş vuruşlarını kullanın gösterilmiştir Ctrl+ Whassas bilgileri silmek ve daha sonra ↓ (down arrow) yeni bir boş satır, istendiğinde kadar önce yazmaya Enter.
Hassas bilgilerin zaten depolanmış olduğunu anlıyorsanız ve silmek istiyorsanız, ancak geçmişinizin tamamını değil:
Basit bir sed
komut işi yapabilir:
sed -e '/SeNsItIvE InFo/d' -i .bash_history
ancak, bunu yazarken, silmeye çalıştığınız arama modelini (hassas bilgiler) içeren başka bir geçmiş satırı oluşturursunuz. Yani yapabilirsin:
sed -e "/$(head -n1)/d" -i .bash_history
Bu head -n1
terminalden giriş ile çalışacaktır . Terminalinizin kapatıldığı anlaşılacak (bir bilgi istemi olmayacak); dosyadan silmek istediğiniz bilgiyi yazmanız yeterlidir. Bu, bir komutu komut satırına yazmadan (komutun bir kısmını) girmenize izin vermek, böylece tarih kaydına dahil olmak için uygun olmamak için bir püf noktasıdır. Ardından
, hassas bilgileri içeren tüm satırları sed
aramak .bash_history
ve silmek için yazdığınız metni kullanır . Not: Hassas bilgi kalıbınız eğik çizgi içeriyorsa, eğik çizgilerden kaçmalı ya sed
da desende görünmeyen bir sınırlayıcı belirtmek için bu sözdizimini kullanmak için komutu değiştirmelisiniz :
sed -e "\|$(head -n1)|d" -i .bash_history
Başka bir yol, yalnızca hassas bilgileri silmek olabilir, ancak bilgileri içeren komutları saklamak olabilir. Bunun için, hassas bilgileri, seçtiğiniz metin yerine kolayca değiştirebilirsiniz:
sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.
Son olarak, bunun başka bir unutulmuş dosyada kalmayacağından emin olmak için :
SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
tüm ilgili dosyaları listeler.
find . -type f -print0 |
xargs -0 grep -l "$SENSITIVEINFO" |
tr \\n \\0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
Hassas bilgilerin tüm oluşumlarını, kök dizin dizinindeki tüm dosyalarda değiştirir .
. Not: Bu komut kullanılsa bile xargs -0
, adlarında yeni satırlı dosyaları işlemeyecektir.
Silmek istediğiniz satırı ↑ (up arrow)buluncaya kadar görün ve ardından Ctrl+ tuşuna basın U. Bu çizgiyi kaldırmalı.
history
Komutu kullanırsanız, satırın yıldızla değiştirilmiş olduğunu görebilirsiniz.
*
.
Birkaç çizgiyi aynı anda kaldırmanız gerekirse, normalde bunu kullanırım:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
Son komutu silmeniz gerekirse aşağıdakileri kullanabilirsiniz:
history -d $((HISTCMD-2))
history | grep <string>
yine de silmek istediği tüm satırları gösteriyor ...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
Bir dizi aralığı geçmişten kaldırmanız gerekirse, aşağıdaki bash işlevi size zaman kazandırabilir:
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
}
İşlev, tipik olarak eklenmelidir $HOME/.bashrc
. Fonksiyonel fonksiyonu kullanmak için, dosyayı çalışan kabuğunuzla ( . $HOME/.bashrc
) tekrar okumanız gerekir . Sonra 200-210 komutlarını tarihçeden silmek için:
$ histdel 200 210
(Not: Bash tarihinden bir dizi komutu silmek için arama yaparsanız, bu soru en iyi arama sonuçları arasındadır. Dolayısıyla, yukarıdaki soru sorduğundan daha fazla olsa da, bazı okuyucular için yararlı olabilir.)
for
Açıklama için alternatif formlar : for n in $(seq "$2" "$1")
Stilistik olarak bazıları tarafından tercih edilir ve seq
işe yaramazsa deneyin for ((n="$2"; n>="$1"; n--))
.
Sadece bunları dene.
$ history
Bu, tarihin ve komutun kimliğini gösterir.
.
.
211 ls
212 javac
Hoş Geldiniz
.
.
kullanmak,
$ history -d 211
Burada 211 tarihin kimliğidir. Şimdi bunu kullanarak kontrol edin
$ history
.
.
211
Java Hoşgeldiniz
. Java 212 Java Hoşgeldiniz .
.
Bu soru sorulup cevaplandığından bu yana uzun zaman geçtiğini biliyorum, ancak tarihçemi temizlemenin ve aynı zamanda oturumu kapatmanın yöntemini göstereceğim.
Koşarım :
history -w && nano "${HISTFILE}" && history -c && exit
Ne işe yarıyor:
history -w
: içinde önbelleğe alınmış tarih yazıyor "${HISTFILE}"
nano "${HISTFILE}"
: düzenlememe izin ver "${HISTFILE}"
Bir sed komut dosyası kullanabilir veya neyi temizlemek istiyorsanız"${HISTFILE}"
history -c
: önbellek geçmişini temizle, böylece bu son komut eklenmedi.exit
: beni önbelleğe alınmış tarih ekleyerek çıkartın ... ama boş;)Bu komuttan sonra temiz bir geçmiş dosyası ile çıkış yapmış olursunuz. Geçmişinizi kontrol etmek için giriş yapın;)
Umarım bu birine yardımcı olur.