Bash geçmiş dosyasından belirli bir satırı kaldırma


Yanıtlar:


108

history -aGeç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.


19
HISTFILE ortam değişkeni ayarlanmışsa, geçmiş dosyası ~ / .bash_history değil, $ {HISTFILE}.
Karolos

20
Girişler, kabuktan çıktığınızda geçmiş dosyasına yazılır. Bu nedenle, kaldırmak istediğiniz bir komutu girdikten sonra, oturumunuzu kapatıp tekrar açmanız veya geçerli kabuk oturumundan kaldırmak için 'history -d xxxx' komutunu kullanmanız gerekir.
Harmic

3
Fakat geçmiş dosyasını düzenleme kaydını nasıl silersiniz?
chiliNUT

5
@chiliNUT: Sadece komutunuza (örneğin vim ~/.bash_history) bir boşlukla başlayın ; boşlukla başlayan komutlar genellikle kaydedilmez (bkz. $HISTCONTROL).
cYrus

Dağıtımımda durumun böyle olduğunu sanmıyorum, ama genel olarak mantıklı olan
chiliNUT

149

Komut satırını kullanarak iki adımda geçmiş dosyasından kaldırmayı başarabilirsiniz:

  1. Yazma history -d <line_number>, bellekteki tarihteki belirli bir satırı siler.
  2. Yazma history -w, geçerli bellek geçmişini ~/.bash_historydosyaya yazar.

İki adım birlikte kalıcı bellek satır kaldırmaktır tarih ve gelen .bash_history dosyası da.


7
En son history -wtarihten nasıl silinir ?
KrIsHnA

@KrIsHnA düzenle ~ / .bash_history el ile
Alexander Myshov

5
Veya eklenmesini önlemek için önüne bir boşluk ekleyin, @ tao'nun cevabında olduğu gibi
Mark

<line_number>Sadece history | grep [unwanted_content]içeren tüm satırları içeren bir liste bulmak için [unwanted_content](şifreler gibi).
AvL

Birden çok (belirli) satırı (kimliğe göre) nasıl silersiniz?
Pathros

39

İçin önlemek ilk tarihin eklenen bir komut, ortam değişkeni emin olmak HISTCONTROLkendi 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

32

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 -ddaha sonra yayınlayan komutlarla geçmişi düzenlemenin alternatifi bir metin editörüyle history -wdüzenlemektir $HISTFILE.


1
“Yukarıdaki komutlarla tarihini kurgulama hala sadece edecek eklemek kalan yeni öğeleri $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.
James Haigh

1
Sanırım bash asıl uzunluğu not alıyor. Kapanış oturumu sırasında, muhtemelen sayısı bu değerden büyük olan öğeleri ekler. Bu değer, sayısı bu değerden küçük veya ona eşit olan bir öğe silindiğinde azaltılırsa, beklendiği gibi çalışır. ;-)
James Haigh

15

Birkaç teknik:

Hassas bilgilerin geçmiş dosyasında saklanmasını önleyin

Bir komut satırına bir şifre girdiyseniz, tüm komutların günlüğe kaydedildiğini fark edin, aşağıdakilerden birini yapabilirsiniz:

  1. Geçmişi kaydetmeden geçerli oturumdan çıkmaya zorla:

     kill -9 $$

    Bu, tüm güncel geçmişi bırakacaktır.

  2. 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 bilgileri geçmiş dosyasından sil

Hassas bilgilerin zaten depolanmış olduğunu anlıyorsanız ve silmek istiyorsanız, ancak geçmişinizin tamamını değil:

Basit bir sedkomut 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 -n1terminalden 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ı sedaramak .bash_historyve 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 sedda 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.

Belirli bir ağaçtaki herhangi bir dosyadan hassas bilgileri silin

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.


11

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ı.

historyKomutu kullanırsanız, satırın yıldızla değiştirilmiş olduğunu görebilirsiniz.


2
Aslında, imleci satıra getirmeniz gerektiğine inanıyorum, Ctrl + U tuşlarına basın ve sonra imleci yukarı veya aşağı başka bir satıra (muhtemelen listenin altındaki boş olanı) işaretleyin. Ayrıca, kesinlikle konuşursak, çizgi bir yıldızla ikame edilmedi. Aksine, komut silindi ve tarihçe numarası a ile eklendi *.
G-Man

1
Bu çok daha güçlü Ctrl + R (artan geçmiş araması ters) sahip olur, daha sonra örneğin [Son], Ctrl + U
sehe

4

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))

2
Bu işe yaramış gibi görünüyordu ama history | grep <string>yine de silmek istediği tüm satırları gösteriyor ...
Brock Hensley 0

1
Bu fisrt silindikten sonra yanlış tarih satırlarını silecektir !!
mivk

1
Neyse ki, yalnızca yanlış silme komutlarını yazdırıyor. Aşağıdakiler doğru silme komutlarını history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
basacaktır

3

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.)


3
forAçıklama için alternatif formlar : for n in $(seq "$2" "$1")Stilistik olarak bazıları tarafından tercih edilir ve seqişe yaramazsa deneyin for ((n="$2"; n>="$1"; n--)).
Scott

3
history | sed -i 59d

59 satır numarasıdır. Bundan daha tatlı bir şey olamaz :)


3

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


2

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:

  1. history -w : içinde önbelleğe alınmış tarih yazıyor "${HISTFILE}"
  2. nano "${HISTFILE}": düzenlememe izin ver "${HISTFILE}"Bir sed komut dosyası kullanabilir veya neyi temizlemek istiyorsanız"${HISTFILE}"
  3. history -c : önbellek geçmişini temizle, böylece bu son komut eklenmedi.
  4. 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.


1

Ayrıca tarih dosyasını doğrudan düzenleyebilirsiniz, örneğin nano .bash_historybash kabuğundaki iseniz?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.