it-swarm-eu.dev

Dočasně pozastavit bash_history na daném shellu?

Existuje nějaký způsob, jak dočasně pozastavit sledování historie v bashu, aby bylo možné vstoupit do jakéhokoli režimu „inkognito“? Do terminálu zadávám věci, které nechci zaznamenávat, citlivé finanční informace.

128
Naftuli Kay

To by mělo být to, co hledáte:

unset HISTFILE

Z man bash

Pokud HISTFILE není nastaveno nebo pokud je soubor historie nepoužitelný, historie se neuloží.

Alternativně, pokud ji chcete přepnout a znovu zapnout, může být jednodušší použít set :

Vypnout

set +o history

Zapnout

set -o history
173
SiegeX

Pomocí bash nastavte HISTCONTROL="ignorespace" a předcházejte mezerou jakýkoli příkaz, který si nepřejete zaznamenávat do historie. V případě, že jste zapomněli podniknout nějaká opatření, je zde také history -d <number> pro odstranění konkrétní položky nebo history -c pro vymazání celé historie příkazů.

33
forcefsck

Ujistěte se, že HISTCONTROL obsahuje ignorespace. Pravděpodobně budete chtít přidat HISTCONTROL=ignorespace (nebo HISTCONTROL=ignoredups:ignorespace nebo něco) k vašemu ~/.bashrc. Poté je z historie vynechán každý příkazový řádek, který začíná mezerou.

Další možností je zahájení nové bash relace, která neuloží její historii.

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent Shell

Pokud se chcete vyhnout uložení několika příkazů a stále chcete používat předchozí šipky pro přístup k předchozím příkazům, použijte:

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

Existují čtyři způsoby (úrovně), jak řídit ukládání příkazů.

  1. První a nejjednodušší je použít ignorespace (nebo ignoreboth):

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"
    

    To umožní použít mezeru před příkazy, které chcete zabránit, aby nebyly zaznamenány do seznamu paměti history. A v důsledku toho, protože v paměti není žádný příkaz, který by mohl být odeslán do souboru, se také vyhnete jeden příkaz, který bude odeslán do souboru uvedeného v $HISFILE.

  2. Vyhněte se zaznamenávání příkazů do souboru v $HISTFILE:

    $ unset HISTFILE
    

    Pokud není nastavena, historie příkazů se neuloží, když skočí z prostředí Shell.

    Nula HISTFILE='' a/nebo nastaveno na HISTFILE=/dev/null pracuje se stejným efektem. Pochopte, že příkazy se stále zaznamenávají do seznamu paměti, zkuste příkaz history nebo šipku nahoru.

    Varování: Pokud je HISTFILE resetován před existencí Shell, vše, co bylo zaznamenáno v paměti, by bylo stejně možné zapsat do souboru.

  3. Vyhněte se zaznamenávání nových příkazů do seznamu historie v paměti. A protože není v paměti, nelze jej zaznamenat do souboru.

    $ shopt -ou history              # or set +o history
    

    Znovu povolte pomocí shopt -os history (nebo set -o history)

  4. Odebrat všechny příkazy ze seznamu historie v paměti:

    $ HISTSIZE=0
    

    Všechny příkazy budou vymazány (z paměti), a proto by se do souboru samozřejmě nemohlo nic uložit, dokud nebude proměnná znovu nastavena na platnou číselnou hodnotu.

6
Isaac

Existuje jednoduchý způsob, jak vypnout historii, takže příkazy nebudou uloženy v .bash_history soubor.

Před každý příkaz musíte umístit mezeru nebo tabulátor, aby tento příkaz nebyl uložen do historie. Například:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

Příkaz pwd nebude uložen do historie, protože má vpředu mezeru.

3
Kalanidhi M.
export HISTFILE=/dev/null 

To je můj goto způsob. Jen v případě, že nefunkční HISTORY/HISTFILE/HISTCONTROL, atd. ... nefunguje, export do/dev/null vždy pracoval pro mě.

2
Ambrose

Chcete-li posunout odpověď SiegeXu o něco dále a opravdu ji proměnit v anonymním režimu ...

Zřeknutí se odpovědnosti: titulní materiál bude pravděpodobně fungovat na gnome terminálu. to bylo testováno pouze v Linux Mint 19.3/Gnome Terminal 3.28.1, protože jsem líný.

Přidejte do svého ~/.bash_functions (předpokládá se, že jej importujete prostřednictvím svého .bashrc/.profile atd):

function setGnomeTerminalTitle() {
    local NEW_TITLE="$1";
    PS1="\[\e]0;${NEW_TITLE}\a\]\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\]";
}

Poté přidejte do svého ~/.bash_aliases (opět to předpokládá, že jej importujete prostřednictvím svého .bashrc/.profile atd):

alias title="setGnomeTerminalTitle";
alias hist='history'
alias histoff="setGnomeTerminalTitle 'Incognito Window' && set +o history"
alias histon="setGnomeTerminalTitle \"[email protected]$HOSTNAME:\${PWD//\${HOME//\\//\\\\\\/}/\\~}\" && set -o history"

ÚPRAVA: vysvětlit věci s názvem histonu - obvykle je název okna v terminálu gnome "$ USER @ $ HOSTNAME: $ {PWD}" s tím rozdílem, že pokud jste ve své domovské složce/home/foo, zobrazí se jako ~; alespoň je to na mém počítači. tento příkaz používá k nahrazení lomítek v $HOME takže dostaneme \/home\/foo a následně to použijeme jako regex k nahrazení tohoto vzoru v $PWD s doslovným ~ ... a pak se na začátek přidá řada úniků, aby to fungovalo jako alias ve dvojitě citovaném řetězci.

Nyní, když napíšete histoff, získáte změnu názvu pro režim inkognito a vaše historie se zastaví pro danou relaci v tomto okně (slovo histoff je stále zaznamenáno, ale nic poté). Pokud potom napíšete histon vrátí název a všechny řádky za histoff až do a včetně řádku s histon nejsou zaznamenány, ale vše za histon je zaznamenáno.

Příklad:

## this is still logged
histoff  

## this is NOT logged
echo "my password is: password";
fake_ua='If firefox and curl had a child, would it be named furl?';
curl -A "$fake_ua" https://www.itsnotap0rnsiteipromise.com/curvy-girlz/;

vi ~/Documents/maths/super-secret-squirrel/gift-ideas.txt

## this is still NOT logged
histon

## this is logged again
Sudo apt install -y kmag;

0
zpangwin