Een bepaalde regel uit het Bash-geschiedenisbestand verwijderen
Hoe kan ik een bepaalde regel uit de database van history
verwijderen?
Hoe kan ik een bepaalde regel uit de database van history
verwijderen?
U kunt de verwijdering uit het geschiedenisbestand met de commandoregel in twee stappen bereiken:
history -d <line_number>
te typen wordt een opgegeven regel uit de geschiedenis in het geheugen verwijderd. 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.
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
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.
Verschillende technieken:
Als je een wachtwoord op een commandoregel hebt ingevoerd, en je realiseert je dan dat alle commando’s worden gelogd, dan kun je ofwel:
Forceer verlaten van de huidige sessie zonder geschiedenis op te slaan:
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.
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.
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.
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).
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 . .
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:
history -w
: schrijft cache geschiedenis binnen "${HISTFILE}"
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
Na dat commando word je uitgelogd met een schoon geschiedenisbestand. Log in om je geschiedenis te controleren ;)
Ik hoop dat dit iemand helpt.