Terminale "modalità di navigazione in incognito"?


230

Uso molto Terminal e, talvolta, eseguo comandi, che non sono cose che non voglio che altri vedano, ma altri comandi che se avessi accidentalmente spostato la freccia verso l'alto ed eseguito accidentalmente, avrebbero causato molti problemi.

Quindi mi chiedo se esiste, o posso fare, una sorta di "modalità di navigazione in incognito" del Terminale che mi consentirebbe, dopo l'esecuzione di un determinato comando, di interrompere la registrazione della mia cronologia, e quindi iniziare a registrare solo dopo aver eseguito una ricominciare a registrare la cronologia di nuovo comando ed uscire da 'modalità di navigazione in incognito', o semplicemente riavviare il Terminale?

Perché in seguito mi ritrovo ad andare a rimuovere roba dal mio .bash_history, quando sarebbe molto più facile se avessi potuto smettere di registrarlo lì in primo luogo, o almeno farlo per provare a registrarlo da qualche parte dove non sarebbe permesso e finirebbe semplicemente per non registrarlo.


6
Bene, presumibilmente sei paranoico che la tua storia verrà letta da altri?
Sparhawk,

6
@Sparhawk: Beh, è ​​in parte quello, e partito non voglio eseguire accidentalmente un comando di manutenzione possibilmente mortale quando sto solo andando in freccia in futuro! : D

19
Solo per aggiungere, non devi giustificarti: "che non sono cose che non voglio che gli altri vedano" . Questo sarebbe un motivo perfettamente valido anche per me. (Soprattutto in questo periodo in cui tutti cercano di farti sembrare in colpa per avere "cose ​​da nascondere")
prima del

2
Se apri due schede, fai le cose nella prima, fai le cose nella seconda, quindi chiudi la seconda PRIMA della prima, solo la cronologia della prima sembra essere scritta .bash_history. (Ubuntu 15.04 rovinato Terminal, fortunatamente questa è una USB live.)
Hitechcomputergeek

1
Vedi questa domanda su serverfault
Luc M

Risposte:


265

Esegui un comando senza inserirlo nella cronologia:

Basta mettere uno spazio prima del comando. Bash ignorerà i comandi con uno spazio anteposto:

Esempio: Spaceecho "Some secret text"

Nota: funziona solo se la HISTCONTROLvariabile è impostata su ignorespaceo ignoreboth.


Disattiva temporaneamente la cronologia:

  • Esegui Spaceset +o historyo Spaceshopt -uo historyper disabilitare la cronologia.
  • Esegui set -o historyo shopt -so historyper abilitarlo di nuovo.

Disabilita la cronologia per la sessione corrente (non ricorderà alcun comando della sessione):

unset HISTFILE

Nota: sarai in grado di vedere i comandi premendo Upfino a quando non chiudi il terminale.


Rimuovi un comando dalla cronologia:

Correre Spacehistory | grep "part of your secret command"

Mostrerà un elenco di comandi precedentemente eseguiti, in questo formato:

casa@portátil:~$  history | grep pkill
  302  pkill $$
  467  pkill gone-cal
  468  pkill actionaz
  500  pkill chrome
  550  pkill super

Seleziona il numero della voce a sinistra del comando. Puoi copiarlo con Ctrl+ Shift+C

Esegui Spacehistory -d <number>dove si <number>trova il numero della voce per rimuovere la voce.
Puoi incollare quel numero con Ctrl+ Shift+V


Altre risposte interessanti:


7
Se usi history -dper rimuovere una linea, questo rimuoverà il contenuto della linea, ma non potrai mai rimuovere il fatto che hai eseguito history -d(a meno che non lo usi set +o historyprima di eseguirlo history -d)
AJFaraday,

1
Mi ha appena ricordato la logica della
superingiunzione

4
(OT) Le iniezioni sono un documento legale che impedisce alle persone di pubblicare qualcosa. Una super ingiunzione impedisce loro di pubblicare il fatto che gli è stata negata la possibilità di pubblicare. Alcuni argomenti logici chiedono se possono pubblicare che gli è stata negata la possibilità di pubblicare alcune informazioni. Quindi diventa un argomento ciclico.
AJFaraday,

1
@Helio Penso che sia meglio per gli utenti conoscere il modo "corretto" di copiare, specialmente se accidentalmente vanno e selezionano del testo. Non sono sicuro di come fare lo spazio, forse chiarire di più che lo spazio è lì? Lo [spazio] mi sembra un po 'goffo ...
Tim

2
L' unset HISTFILEapproccio funziona anche in modo retroattivo per tutti i comandi a cui non è stato .bash_historyancora scritto .
Kasperd,

40

È possibile semplicemente eliminare la cronologia di una particolare sessione terminale aggiungendo il comando history -cwdopo aver funzionato.

Non chiudere il terminale prima di dare questo comando.


Questo non rimuoverà tutta la cronologia?
Helio,

6
Ciò rimuoverà solo la cronologia di quella particolare sessione terminale.
Moithil Biswas è stato

28

shopt -uo history dovrebbe farlo al meglio.

Nuking le HISTFILEvariabili (et al) non impedirà la Upregistrazione della cronologia, ma non la spingerà su disco. Questa potrebbe essere o meno una cosa positiva per te, ma dato che te ne hai parlato, immagino che tu voglia qualcosa di meglio. La modifica dell'impostazione della shoptcronologia impedisce l'attivazione dell'intero meccanismo della cronologia.

È possibile riattivare la registrazione con shopt -so history(rispettivamente -se -usono impostati e non impostati).

Si noti che il comando stesso verrà probabilmente registrato, quindi anteporre uno spazio per impedirne l'aggiunta alla cronologia prima di cancellare la variabile.


17

Un altro modo per uccidere la shell corrente senza accedere al file della cronologia è fare:

kill -9 $$

Questo fa sì che bash (e probabilmente anche altre shell) invii il segnale SIGKILL a se stesso, uccidendolo sul posto e impedendogli di scrivere qualsiasi cosa sul disco.


7
alias "Sparati in testa" :). Questo ha il vantaggio di non dover ricordare di fare qualcosa prima di scrivere i comandi.
Guido,

3
Uso zsh con la scrittura cronologica incrementale, quindi dubito che funzionerebbe nel mio caso
Wayne Werner,

13

Per disabilitare temporaneamente la cronologia dei comandi per la sessione corrente, è possibile disattivare temporaneamente la variabile di ambiente HISTFILE.

unset HISTFILE

mentre la sessione è attiva è possibile accedere alla cronologia come al solito, ma non verrà salvata sul disco.

Per invertire nella stessa sessione (tutte le modifiche verranno registrate)

HISTFILE=$HOME/.bash_history

1
E c'è un modo semplice nella sessione corrente per invertire questo, e farlo continuare?

@ParanoidPanda Ho aggiunto un comando per il ripristino nella sessione corrente.
Bruni,

1
@ParanoidPanda: Perché hai bisogno di un comando per reimpostare HISTFILEla sessione corrente? Se annulli la modifica (anche dopo aver eseguito i comandi segreti), questi verranno archiviati nella cronologia quando esci.
Helio,

@Helio: Oh, no, intendevo un comando che avrebbe quindi ricominciato a registrare, ma non salvare i comandi che non volevo salvasse.

1
@ParanoidPanda, Helio sembra aver ragione su questo mentre la storia viene salvata all'uscita. Non avevo considerato quello.
Bruni,

10

È possibile modificare le righe della cronologia nella sessione di shell corrente. Se si ripercorre la cronologia (ad es. Con Upo Ctrl+ P) e si modifica una riga senza eseguirla , verrà salvata solo la versione modificata della riga. Puoi modificarlo come preferisci; le buone scelte includono l'uso di Ctrl+ Uper svuotare completamente la riga o usare Esc#per inserire un #carattere di commento all'inizio.

Per lasciare una linea senza eseguirla, ricordati di non premere Return( Enter). Quello che faccio è tornare alla riga più recente della storia tramite Esc>.

(Invece di essere Escseguito da >, nella maggior parte dei terminali puoi tenere premuto Alte premere >; lo stesso vale per il Esc#suggerimento sopra.)

Nota: non è possibile modificare in modo permanente le voci delle sessioni precedenti in questo modo. Tali modifiche non verranno applicate alla HISTFILEfine della sessione.


6

Puoi anche rendere .bash_history di sola lettura. Vorrei prima svuotare il file e poi fare:

 chattr +i .bash_history

5

È possibile eseguire i comandi sensibili in una sessione dello schermo, quindi distruggere la sessione al termine.

In alternativa, è possibile mantenere viva quella sessione dello schermo ma staccata e accedervi solo quando si desidera effettivamente essere in grado di spostare la freccia verso i comandi altrimenti pericolosi.


1

Personalmente lo uso mksh, e questa shell di default non ha file di cronologia. Ciò significa che potresti lanciare shell alternative come mksho dash(che viene fornito di default a proposito) per eseguire il comando che non vuoi che gli utenti vedano e uscire una volta fatto. bashla storia registrerà solo che hai lanciato shell alternativa e il gioco è fatto.


1

È inoltre possibile utilizzare multiplexer terminale come tmux, screen. Quindi sotto tmuxo la screenstoria non verrebbe salvata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.