Terminal 'modo anônimo'?

230

Eu uso muito o Terminal e, às vezes, estou executando comandos, que não são coisas que eu não quero que os outros vejam, mas mais comandos que se eu acidentalmente disparasse e executasse causaria muitos problemas.

Por isso, estou me perguntando se existe, ou posso fazer, algum tipo de 'modo de navegação anônima' do Terminal que me permitiria, após a execução de um determinado comando, parar de gravar meu histórico e só começar a gravar depois de executar um começar a gravar o histórico novamente comando e sair do "modo de navegação anônima", ou simplesmente reinicio o terminal?

Porque eu me vejo mais tarde removendo coisas do meu .bash_history, quando seria muito mais fácil se eu pudesse parar a gravação lá em primeiro lugar, ou pelo menos consegui tentar gravar em algum lugar onde simplesmente não estaria permitido, e acabaria não gravando.


fonte
6
Bem, presumivelmente você está paranóico porque sua história será lida por outros?
Sparhawk
6
@ Sparhawk: Bem, em parte é isso, e a parte que eu não quero executar acidentalmente um comando de manutenção possivelmente mortal quando eu estiver aparecendo no futuro! : D
19
Só para acrescentar, você não precisa se justificar: "que não são coisas que eu não quero que os outros vejam" . Essa seria uma razão perfeitamente válida para mim também. (Especialmente nesta época em que todos tentam fazer com que você pareça culpado por ter "coisas a esconder")
antes de
2
Se você abrir duas guias, faça as coisas na primeira, faça as coisas na segunda e feche a segunda antes da primeira, apenas o histórico da primeira parece estar gravado .bash_history. (Ubuntu 15.04 arruinada Terminal, sorte este é um USB ao vivo.)
Hitechcomputergeek
1
Veja esta pergunta em serverfault
Luc M

Respostas:

265

Execute um comando sem colocá-lo no histórico:

Simplesmente coloque um espaço antes do comando. O Bash ignorará os comandos com um espaço precedido:

Exemplo: Spaceecho "Some secret text"

Nota: Isso funciona apenas se a HISTCONTROLvariável estiver definida como ignorespaceou ignoreboth.


Desative o histórico temporariamente:

  • Execute Spaceset +o historyou Spaceshopt -uo historydesative o histórico.
  • Execute set -o historyou shopt -so historypara habilitá-lo novamente.

Desabilite o histórico da sessão atual (não se lembrará de nenhum comando da sessão):

unset HISTFILE

Nota: Você poderá ver os comandos pressionando Upaté fechar o terminal.


Remova um comando do histórico:

Corre Spacehistory | grep "part of your secret command"

Ele mostrará uma lista de comandos executados anteriormente, neste formato:

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

Selecione o número da entrada à esquerda do comando. Você pode copiá-lo com Ctrl+ Shift+C

Execute Spacehistory -d <number>onde <number>está o número da entrada para remover a entrada.
Você pode colar esse número com Ctrl+ Shift+V


Outras respostas interessantes:

Helio
fonte
7
Se você usar history -dpara remover uma linha, isso irá remover o conteúdo da linha, mas você nunca pode remover o fato de que você executou history -d(a menos que você primeiro uso set +o historyantes de executar history -d)
AJFaraday
1
Apenas me lembrou a lógica da super injunção, só isso;) #
AJFaraday
4
(OT) Injunções são um documento legal que impede as pessoas de publicar algo. Uma super liminar também os impede de publicar o fato de lhes ter sido negada a capacidade de publicar. Alguns argumentos lógicos perguntam se eles podem publicar que foi negada a capacidade de publicar algumas informações. Então se torna um argumento cíclico.
AJFaraday
1
@ Helio Eu acho que é melhor para os usuários saber a maneira "correta" de copiar - especialmente se eles acidentalmente selecionarem algum texto. Não sei bem como fazer o espaço, talvez esclareça mais que o espaço existe? O [espaço] parece um pouco desajeitado para mim ... #
181 de Tim
2
A unset HISTFILEabordagem também funciona retroativamente para todos os comandos que ainda não foram gravados .bash_history.
Kasperd
40

Você pode simplesmente excluir o histórico de uma sessão de terminal específica, adicionando o comando history -cwapós o trabalho.

Não feche o terminal antes de dar este comando.

Moithil Biswas
fonte
Isso não removerá todo o histórico?
Helio
6
Isso removerá apenas o histórico daquela sessão de terminal específica.
Moithil Biswas
28

shopt -uo history deve fazer melhor.

Nuking as HISTFILEvariáveis ​​(et al) não impedirá o Upregistro do seu histórico, apenas não o empurrará para o disco. Isso pode ou não ser positivo para você, mas, como você mencionou, acho que você quer algo melhor. Alterar a shoptconfiguração do histórico impede que todo o mecanismo do histórico seja acionado.

Você pode ativar o logon novamente com shopt -so history( -se -usão definidos e desativados, respectivamente).

Observe que o próprio comando provavelmente será registrado, portanto, acrescente um espaço para impedir que ele seja adicionado ao histórico antes de limpar a variável.

Oli
fonte
17

Outra maneira de eliminar o shell atual sem fazer logon no arquivo de histórico é:

kill -9 $$

Isso faz com que o bash (e provavelmente outras conchas também) envie o sinal SIGKILL para si mesmo, matando-o no local e impedindo que ele grave qualquer coisa no disco.

idiota
fonte
7
aka 'Atire na sua cabeça' :). Isso tem a vantagem de que você não precisa se lembrar de fazer nada antes de escrever os comandos.
Guido
3
Eu uso zsh com write história incremental, por isso duvido que isso iria funcionar no meu caso
Wayne Werner
13

Para desabilitar temporariamente o histórico de comandos da sessão atual, você pode desabilitar temporariamente a variável de ambiente HISTFILE.

unset HISTFILE

enquanto a sessão estiver ativa, você poderá acessar o histórico como de costume, mas ele não será salvo no disco.

Para reverter na mesma sessão (todas as alterações serão registradas)

HISTFILE=$HOME/.bash_history
Bruni
fonte
1
E existe uma maneira fácil na sessão atual de reverter isso e fazê-lo continuar?
@ParanoidPanda Adicionei um comando para reverter na sessão atual.
Bruni
1
@ParanoidPanda: Por que você precisa de um comando para definir HISTFILEnovamente na sessão atual? Se você desfazer a alteração (mesmo depois de executar os comandos secretos), eles serão armazenados no histórico quando você sair.
Helio
@ Helio: Ah, não, eu quis dizer um comando que começaria a gravar novamente, mas não salvaria os comandos que não queria que ele salvasse.
1
@ParanoidPanda, Helio parece estar certo nesse caso, pois a história é salva na saída. Eu não tinha considerado esse.
Bruni
10

Você pode modificar as linhas do histórico na sessão atual do shell. Se você voltar ao histórico (por exemplo, com Upou Ctrl+ P) e alterar uma linha sem executá-la , somente a versão modificada da linha será salva. Você pode modificá-lo da maneira que quiser; boas escolhas incluem usar Ctrl+ Upara deixar a linha totalmente em branco ou usar Esc#para colocar um #caractere de comentário no início.

Para deixar para trás uma linha sem executá-la, lembre-se de não pressionar Return( Enter). O que faço é retornar à mais nova linha da história via Esc>.

(Em vez de Escseguido por >, na maioria dos terminais, você pode segurar Alte pressionar >; o mesmo vale para a Esc#sugestão acima.)

Nota: Você não pode modificar permanentemente as entradas das sessões anteriores dessa maneira. Essas alterações não serão aplicadas HISTFILEno final da sessão.

echristopherson
fonte
6

Você também pode tornar .bash_history somente leitura. Eu esvaziaria o arquivo primeiro e depois faria:

 chattr +i .bash_history
Webtm
fonte
5

Você pode executar os comandos sensíveis em uma sessão da tela e destruir a sessão quando terminar.

Como alternativa, você pode manter a sessão da tela ativa, mas desanexada, e acessá-la somente quando você realmente deseja ativar a seta para os comandos de outra forma perigosos.

keag
fonte
1

Pessoalmente, eu uso mksh, e esse shell por padrão não tem arquivo de histórico. Isso significa que você pode iniciar um shell alternativo como mkshor dash(que vem por padrão) para executar o comando que você não quer que os usuários vejam e sair depois que terminar. basho histórico registrará apenas que você lançou o shell alternativo e é isso.

Sergiy Kolodyazhnyy
fonte
1

Você também pode usar multiplexer terminal, como tmux, screen. Portanto, o histórico tmuxou a screenhistória não seriam salvos.

vusan
fonte