2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152

Een bepaalde regel uit het Bash-geschiedenisbestand verwijderen

Hoe kan ik een bepaalde regel uit de database van history verwijderen?

Antwoorden (12)

152
152
152
2012-01-31 16:09:25 +0000

U kunt de verwijdering uit het geschiedenisbestand met de commandoregel in twee stappen bereiken:

  1. Door history -d <line_number> te typen wordt een opgegeven regel uit de geschiedenis in het geheugen verwijderd.
  2. Het typen van history -w schrijft de huidige in-memory historie naar het ~/.bash_history bestand.

De twee stappen samen verwijderen de regel permanent uit de geschiedenis in het geheugen en ook uit het bestand .bash_geschiedenis.

118
118
118
2012-01-31 16:01:05 +0000

Je moet uitloggen en weer inloggen of history -a uitvoeren zodat de huidige geschiedenis op schijf wordt vastgelegd.

Bewerk dan gewoon het bestand ~/.bash_history.

41
41
41
2012-02-01 22:19:06 +0000

Om te voorkomen dat een commando aan de geschiedenis wordt toegevoegd, moet je ervoor zorgen dat de omgevingsvariabele HISTCONTROL tussen zijn door dubbele punten gescheiden waarden de waarde ignorespace bevat, bijvoorbeeld (voeg bijv. toe aan .bashrc):

$ export HISTCONTROL=ignorespace

Dit voorkomt dat een commando met een voorloopspatie aan de geschiedenis wordt toegevoegd. Je kunt de geschiedenis dan volledig wissen door

$ history -c -w
  ^-- additional space character
33
33
33
2013-06-18 16:33:19 +0000

Ten eerste, als het commando dat je gaat geven gevoelig of onveilig is, of als je het niet nodig vindt dat je geschiedenis er een rommeltje van wordt, is het het beste/snelste om gewoon te voorkomen dat het in de geschiedenis komt. Zorg ervoor dat $HISTCONTROL ignorespace bevat:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Ga dan verder met elk commando dat je niet in je geschiedenis wilt hebben met een spatie:

(bash)$ sensitive-cmd-with --password 82cf7dfe
(bash)$ rm -r... # One-off recursive remove; mustn't be accidentally repeated!

Als je per ongeluk een ongewenst commando in de geschiedenis zet, mits je bash sessie nog open is, is het commando nog niet op de schijf terecht gekomen. Om het vorige commando in de geschiedenis te wissen, voer je uit:

(bash)$ history -d $((HISTCMD-1))

_Noteer de voorloopspatie; dit commando heeft ignorespace nodig, anders wist het zichzelf gewoon! _

Als je de laatste paar commando’s wilt wissen, zoek dan het laatste en het eerste geschiedenisnummer:

(bash)$ history 5
  598 ok
  599 sensitive
  600 unsafe
  601 doesn 

In dit geval 602 en 599. Geef dan: 

(bash)$ for i in {602..599}; do history -d $i; done “`

(Zonder ignorespace zou het 603..599. zijn.)

Als je niet wilt dat er geen geschiedenis van je huidige sessie op de schijf terechtkomt, sluit je af met:

(bash)$ kill -9 $$

De aanpak tot nu toe is om zelfs gevoelige historie-items niet naar schijf te laten schrijven voor extra veiligheid, omdat in theorie gegevens die van niet-vluchtige media zijn verwijderd nog teruggehaald kunnen worden.

Als de commando’s die je wilt verwijderen echter van een eerdere sessie zijn, zullen ze al aan de $HISTFILE bij exit zijn toegevoegd. Het manipuleren van de geschiedenis met de bovenstaande commando’s zal nog steeds alleen de resterende nieuwe items bij afsluiten aan de $HISTFILE toevoegen. Om de $HISTFILE te overschrijven met de huidige sessie’s weergave van de gehele geschiedenis, nu, voer uit:

(bash)$ history -w

Natuurlijk voor geschiedenis items die al op schijf staan, is het alternatief voor het bewerken van de geschiedenis met history -d commando’s en dan history -w uit te voeren, het bewerken van de $HISTFILE met een tekst editor.t-work 602 otherwise-unwanted ”`

In dit geval 602 en 599. Geef dan:

0x1&

(Zonder 0x6& zou het 603..599. zijn.)

Als je niet wilt dat er geen geschiedenis van je huidige sessie op de schijf terechtkomt, sluit je af met:

0x1&

De aanpak tot nu toe is om zelfs gevoelige historie-items niet naar schijf te laten schrijven voor extra veiligheid, omdat in theorie gegevens die van niet-vluchtige media zijn verwijderd nog teruggehaald kunnen worden.

Als de commando’s die je wilt verwijderen echter van een eerdere sessie zijn, zullen ze al aan de 0x6& bij exit zijn toegevoegd. Het manipuleren van de geschiedenis met de bovenstaande commando’s zal nog steeds alleen de resterende nieuwe items bij afsluiten aan de 0x6& toevoegen. Om de 0x6& te overschrijven met de huidige sessie’s weergave van de gehele geschiedenis, nu, voer uit:

0x1&

Natuurlijk voor geschiedenis items die al op schijf staan, is het alternatief voor het bewerken van de geschiedenis met 0x6& commando’s en dan 0x6& uit te voeren, het bewerken van de 0x6& met een tekst editor.

17
17
17
2013-07-19 12:50:40 +0000

Verschillende technieken:

Voorkomen dat gevoelige informatie in het history-bestand wordt opgeslagen

Als je een wachtwoord op een commandoregel hebt ingevoerd, en je realiseert je dan dat alle commando’s worden gelogd, dan kun je ofwel:

  1. Forceer verlaten van de huidige sessie zonder geschiedenis op te slaan:

    1. Type ↑ (pijltje naar boven) in de open bash sessie totdat de gevoelige informatie wordt getoond, gebruik dan toetsaanslagen zoals Ctrl+W om de gevoelige informatie te verwijderen, en daarna ↓ (pijltje naar beneden) totdat een nieuwe lege regel wordt gevraagd, voor je Enter typt.

Verwijder gevoelige informatie uit het geschiedenis bestand

Als je je realiseert dat er al gevoelige informatie is opgeslagen, en je wilt die verwijderen, maar niet je hele geschiedenis:

Een eenvoudig sed commando zou kunnen werken:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

maar, terwijl je dit typt, creëer je een andere geschiedenisregel met het zoekpatroon (gevoelige informatie) dat je probeert te verwijderen. Dus je zou kunnen:

sed -e "/$(head -n1)/d" -i .bash_history

Dit zal head -n1 uitvoeren met invoer van de terminal. Het zal lijken alsof je terminal is opgehangen (er zal geen prompt zijn); typ gewoon de informatie die je wilt verwijderen uit het bestand. Dit is een truc om u (een deel van) een commando te laten invoeren zonder het daadwerkelijk in de commandoregel te typen, waardoor het niet in aanmerking komt voor opname in de geschiedenisrecord. Dan zal sed de tekst die je getypt hebt gebruiken om .bash_history te doorzoeken en alle lijnen die de gevoelige info bevatten te wissen. Opmerking: als je patroon voor gevoelige informatie schuine strepen bevat, moet je die weglaten met backslashes, of anders het sed commando zo wijzigen dat het deze syntaxis gebruikt om een scheidingsteken op te geven dat niet in het patroon voorkomt:

sed -e "\|$(head -n1)|d" -i .bash_history

Een andere manier zou kunnen zijn om alleen de gevoelige info te verwijderen, maar de commando’s te behouden die de informatie bevatten. Hiervoor zou je simpelweg de gevoelige info kunnen vervangen door vervangende tekst naar keuze:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

Verwijder gevoelige informatie uit elk bestand in een specifieke boom

Tenslotte, om er zeker van te zijn dat dit niet in een ander vergeten bestand blijft staan:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

zal een lijst maken van alle betrokken bestanden.

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \n \0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

zal alle voorkomens van gevoelige info vervangen in alle bestanden in de directory boom geworteld op .. Opmerking: ook al gebruikt dit commando xargs -0, het zal geen bestanden met nieuwe regels in hun naam behandelen.

12
12
12
2015-04-01 16:00:26 +0000

Zoek de regel die je wilt verwijderen door op ↑ (pijltje naar boven) te drukken tot hij verschijnt, druk dan op Ctrl+U. Dat zou de lijn moeten verwijderen.

Als u het commando history gebruikt, kunt u zien dat de regel is vervangen door een sterretje.

5
5
5
2013-01-07 05:53:04 +0000

Als je meerdere regels tegelijk moet verwijderen gebruik ik normaal dit:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

Als je het laatste commando moet verwijderen kun je gebruiken:

history -d $((HISTCMD-2))
3
3
3
2012-10-26 14:09:51 +0000

Als je een reeks regels uit de geschiedenis moet verwijderen, kan de volgende bash-functie je wat tijd besparen:

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
}

Functie moet typisch worden toegevoegd aan $HOME/.bashrc. Om de functie onmiddellijk te gebruiken, moet je het bestand opnieuw laten lezen door je draaiende shell (. $HOME/.bashrc). Om dan b.v. commando’s 200-210 uit de geschiedenis te verwijderen:

$ histdel 200 210

(Opmerking: Deze vraag staat in de top zoekresultaten als je zoekt naar het verwijderen van een reeks commando’s uit de bash geschiedenis. Dus, hoewel het bovenstaande meer is dan wat de vraag vraagt, kan het nuttig zijn voor sommige lezers).

3
3
3
2014-03-04 11:16:04 +0000

Probeer gewoon deze,

$ history

dit zal de id van de geschiedenis en het commando weergeven, bijv.

. . 211 ls 212 javac Welcome.java 213 java welcome . .

gebruik,

$ history -d 211

Hier is 211 de id van de geschiedenis. Controleer dit nu met

$ history

. . 211 javac Welcome.java 212 java welcome . .

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

59 is het regelnummer. Er kan niets mooiers zijn dan dit :)

2
2
2
2015-09-30 04:57:29 +0000

Ik weet dat het lang geleden is dat deze vraag gesteld en beantwoord is, maar ik zal je mijn methode laten zien om mijn geschiedenisbestand op te schonen en tegelijkertijd uit te loggen.

Ik draai :history -w && nano "${HISTFILE}" && history -c && exit

Wat het doet is simpel:

  1. history -w : schrijft cache geschiedenis binnen "${HISTFILE}"
  2. nano "${HISTFILE}" : schrijft cache geschiedenis binnen "${HISTFILE}" "${HISTFILE}" : laat me toe om history -c te bewerken Je zou een sed script kunnen gebruiken of wat je maar wil om je exit
  3. 0x6& : Wis de cache geschiedenis zodat dit laatste commando niet wordt toegevoegd.
  4. 0x6& : log me uit append cached history… maar die is leeg ;)

Na dat commando word je uitgelogd met een schoon geschiedenisbestand. Log in om je geschiedenis te controleren ;)

Ik hoop dat dit iemand helpt.

1
1
1
2017-03-27 14:10:10 +0000

Je zou het history bestand ook direct kunnen bewerken, bijvoorbeeld nano .bash_history als je in de bash shell zit?