Executar comando sem mantê-lo no histórico [fechado]

203

Quero executar alguns comandos, mas não quero armazená-los no histórico de comandos. Para que ninguém possa procurá-lo no .bash_historyarquivo.

Existe alguma maneira de executar comandos bash dessa maneira?

Jan Vorcak
fonte
13
Esta pergunta provavelmente deve ser movida para o ServerFault, pois não é "programação", mas "administrador do servidor" - mas obrigado pela pergunta / resposta, exatamente o que eu precisava!
Andrew Theken

Respostas:

294

Inicie seu comando com um espaço e ele não será incluído no histórico.

Esteja ciente de que isso exige que a variável de ambiente $HISTCONTROLseja definida.

  • Verifique se o seguinte comando retorna ignorespaceou ignoreboth

    #> echo $HISTCONTROL
  • Para adicionar a variável de ambiente, se estiver ausente, a seguinte linha pode ser adicionada ao perfil do bash. Por exemplo%HOME/.bashrc

    export HISTCONTROL=ignorespace

Depois de buscar o perfil novamente, comandos com prefixo de espaço não serão gravados em $HISTFILE

u-punkt
fonte
20
Isso não funciona, a menos que ignorespace esteja incluído no $ HISTCONTROL - embora esse seja provavelmente o padrão na maioria dos sistemas.
PGL
2
Corrigir. Para mais detalhes, o OP deve consultar HISTCONTROL e HISTIGNORE na página do manual do bash.
você precisa
2
thegeekstuff.com/2008/08/… - mais dicas do histórico do bash estão disponíveis aqui, incluindo este método de ocultar comandos do histórico
user379997
52

Em qualquer sessão do Bash, defina o arquivo de histórico como / dev / null digitando:

export HISTFILE=/dev/null

Observe que, conforme indicado nos comentários, isso não gravará nenhum comando nessa sessão no histórico!

Só não mexa no trabalho duro do administrador do sistema, por favor;)

A solução do Doodad é mais elegante. Simplesmente desmarque a variável: unset HISTFILE(obrigado!)

Miquel
fonte
5
Isso impedirá que todos os comandos sejam registrados. Não é o que o questionador quer.
Noufal Ibrahim
12
Isso me causou problemas relacionados a /dev/nullpermissões definidas para 0600 no logout. Em vez disso eu usei unset HISTFILE.
Doodad
36
echo "discreet";history -d $(history 1)
John Doe
fonte
4
Ooh, controle por comando? Agradável.
Kyle Strand
21

Uma extensão da resposta de @John Doe & @ user3270492. Mas, isso parece funcionar para mim.

<your_secret_command>; history -d $((HISTCMD-1))

Você não deve ver a entrada do comando no seu histórico.

Aqui está a explicação ..

O 'history -d' exclui a entrada mencionada do histórico.

O HISTCMD armazena o número do comando daquele a ser executado a seguir. Portanto, (HISTCMD-1) refere-se ao último comando executado.

Remova uma determinada linha do arquivo de histórico do Bash

Rangaraj KS
fonte
Infelizmente isso não funcionou para mim.
Magick
10

Você pode considerar usar um shell sem histórico, como talvez

/bin/sh << END
   your commands without history
END

(talvez /bin/dashou /bin/sashpossa ser mais apropriado que /bin/sh)

ou melhor ainda, use o utilitário de lote , por exemplo

batch << EOB
   your commands
EOB

A história conteria então shou batchque não é muito significativa

Basile Starynkevitch
fonte
8

Você pode iniciar sua sessão com

export HISTFILE=/dev/null ;history -d $(history 1)

então prossiga com suas ações sorrateiras. Configurando o arquivo histórico para/dev/null arquivo histórico será registrada no arquivo de histórico, mas essa entrada será prontamente excluída e nenhum vestígio (pelo menos no arquivo de histórico) será mostrado.

Além disso, isso não é permanente.

cristão
fonte
Isso já foi respondido várias vezes. O que você diria que sua resposta adiciona a esse tópico (exceto ruídos inúteis)?
Gnicf_gniourf
Não foi reunido em uma resposta , para não ter o próprio comando aparecendo na história e não aparecer nada que seja digitado posteriormente.
Christian
1
Mas agora esta discussão é uma verdadeira bagunça! neste caso, especialmente para uma pergunta tão velho, eu acredito que é melhor que você editar já existente boas respostas, e / ou deixar um comentário ...
gniourf_gniourf
5

Como mencionado por Doodad nos comentários , unset HISTFILEisso é muito bom, mas se você também quiser excluir algum histórico, faça echo $HISTFILEpara obter o local do arquivo de histórico (geralmente ~/.bash_history) unset HISTFILEe edite ~/.bash_history(ou o que quer que HISTFILEfosse - é claro que agora é unsetpara que você possa " não leia).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Então você editou seu histórico e o fato de editá-lo!

drkvogel
fonte
Tentei isso em: GNU bash, versão 3.2.57 (1) -release (x86_64-apple-darwin15) e não funciona. Os comandos I utilizados após HISTÓRIA unset foram armazenadas em ~ / .bash_history
Krystian
@ Krystian Meu erro - eu escrevi "HISTORY desabilitado" quando deveria ser "HISTFILE desabilitado" - corrigido. Isso funciona agora? Funciona no GNU bash, versão 4.3.30 (1) -release (x86_64-pc-linux-gnu).
Drkvogel 02/03
bem, eu não tenho certeza. Teste simples: unset HISTFILE; echo TEST; historyfornecerá o comando echo TESTcomo anterior ao último. Embora após o término da sessão e a conexão novamente, o histórico não possua essa entrada. Então, eu diria que funciona :)
Krystian
unset HISTFILEnão parece impedir que os comandos sejam gravados no histórico da memória, mas impede que eles sejam gravados em qualquer arquivo $ HISTFILE. Acho que você ainda tem seu histórico local na memória, mas ele não está mais sendo gravado em um arquivo, e é isso que você pode querer! ;)
drkvogel 03/03
4

Você também pode usar o seguinte comando:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Eu acho que é um comando muito portátil.

Cédric ROYER
fonte
Criei alias esta: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"E agora você pode fazê-lo algo como isto:mysql -uroot -pSecretPassword ; forget
sobi3ch
1
Desculpe, mas eu sei que você precisa criar uma função em vez de um alias, pois as aspas alteram o significado de $se outras coisas no sed. function forget() { // put code here // }
sobi3ch
3

Se você estiver usando o zsh, poderá executar:

setopt histignorespace

Depois que isso for definido, cada comando começando com um espaço será excluído do histórico.

Você pode usar aliases em .zshrctransformar esta on / off :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'
Rotareti
fonte
Bom, mas esta questão é especificamente marcado festa
tripleee
2

Existem várias maneiras de conseguir isso. Isso define o tamanho do arquivo de histórico como 0:

export HISTFILESIZE=0

Isso define o arquivo de histórico para /dev/nulldesativá-lo efetivamente:

export HISTFILE=/dev/null

Para comandos individuais, você pode prefixar o comando com um espaço e ele não será salvo no arquivo de histórico. Observe que isso requer que você tenha o ignorespacevalor incluído na $HISTCONTROLvariável de ambiente (man bash e procure ignorespacepor mais detalhes).

pgl
fonte
2
Isso impedirá que todos os comandos sejam registrados. Não é o que o questionador quer.
Noufal Ibrahim
Bem, eu meio que assumi que o interlocutor redefiniria os valores depois de fazer o que ele queria que não fosse registrado.
PGL
1

Isso é útil se você deseja apagar toda a história, incluindo o fato de ter apagado toda a história!

rm .bash_history;export HISTFILE=/dev/null;exit
cnd
fonte
0

Você só precisa executar:
$ set +o history

Para ver mais, execute:
$ man set

Igor Santos
fonte
2
Isso desativa o histórico para todos os comandos futuros, não para um comando individual. A maioria das pessoas que vem aqui deve procurar a resposta aceita.
Tripleee
Isso é válido ou está bom, mas incompleto. Enquanto adicionarmos o comando reverso set -x historydepois, ele funcionará.
Abdillah 23/04
0

Este comando pode ser útil. Isso não registrará o comando que é executado

history -d $((HISTCMD-1)) && <Your Command Here>
RAVI THEJA
fonte