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?


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


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!)


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


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


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


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.


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!


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.


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."'

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).


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

0

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

Para ver mais, execute:
$ man set


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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.