Questão Eu acidentalmente digitei senha na linha de comando do bash


Eu acidentalmente digitei minha senha na linha de comando bash, confundindo o Last login: ... linha para Wrong password (Eu estava com pressa). O que eu faço para cobrir meu rastro?

O que eu fiz foi editar .bash_history e excluindo a linha ofensiva (tive que relogar uma vez para ver a senha aparecer no arquivo para que eu pudesse excluí-la e relogar novamente para vê-la desaparecer do histórico disponível na tecla UPARROW).

Existe algum outro lugar onde o histórico de comandos possa ser salvo? O sistema é o CentOS 6.5.


179


origem


Apenas mude a senha :) - gronostaj
Mudar a senha não é tão simples ... Eu preciso pedir ao administrador para reinstalar minha nova chave pública em 15 servidores diferentes - e o cara é como /dev/null. - MaDa
Se você não puder alterar sua senha facilmente a qualquer momento, talvez você tenha uma séria lacuna de segurança. O que você fará quando alguém realmente obtiver sua senha? Você tem algum meio de revogar imediatamente o acesso ao sistema? - gronostaj
Você pode alterar a frase secreta de uma chave ssh sem alterar a chave: ssh-keygen -f id_rsa -p. - jwg
Basta entrar para mencionar que, pelo menos em logins do Windows em rede, você é lavado. O padrão admin (em algumas torres de servidores elevados) é registrar todas as tentativas de login e, é claro, os nomes de usuários são em texto puro. Tudo o que uma pessoa empreendedora precisa fazer é procurar por strings que não sejam de nome de usuário e correlacioná-las com o próximo nome de usuário válido (ou a próxima tentativa de login na mesma máquina). E não há uma maneira simples de excluir esse arquivo de log do administrador. Então você realmente precisa mudar sua senha. - Carl Witthoft


Respostas:


Você pode remover apenas a linha ofensiva de basha história de Deus, em vez de limpar toda a história. Simplesmente remova a linha com o -d sinalizador, salve (escreva) o novo histórico com o -w bandeira:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w

174



Esteja ciente de que isso não funcionará se você tiver definido "PROMPT_COMMAND = history -a". Com isso, o comando com sua senha é imediatamente gravado em sua .bash_history quando o prompt é exibido após o término do comando. Você terá que editar sua .bash_history para removê-la. - benrifkah


Existem duas partes para isso:

  • bash armazena o histórico em um arquivo ~/.bash_history que é, por padrão, escrito no final da sessão
  • a history que é mantido na memória

Para estar seguro, você precisa limpá-lo da sessão:

history -c

e truncar o arquivo de histórico conforme necessário:

> ~/.bash_history

Se a sua sessão em que você digitou a senha ainda estiver aberta, outra maneira de cobrir seu traço é definir o HISTFILE variável para o dispositivo nulo para que o histórico não seria gravado para ~/.bash_history quando a sessão sai:

export HISTFILE=/dev/null

120



Ei olha, é o admin! - Raystafarian
Pun não intencional, desculpe :) Eu não estava olhando para o seu nick quando eu estava escrevendo meu comentário. - MaDa
Para ser paranóico (e ainda por algum motivo ainda não mude sua senha) você não deveria shred o arquivo ou sobrescrevê-lo muitas vezes? - kojiro
@MaDa Não tem problema. Eu até adicionei outro caminho na resposta para trazer meu nick para a foto. - devnull
Configuração HISTFILE= basta. A partir de bash(1): Se não definido, o histórico do comando não é salvo quando um shell é encerrado. - Lekensteyn


Como o bash (pelo menos todas as versões históricas e atuais que conheço) não salva automaticamente o histórico até que você saia, uma estratégia geralmente aplicável ao digitar um comando que deseja garantir que nunca seja salvo é digitar imediatamente:

kill -9 $$

Isso mata a casca com SIGKILL, que não pode ser capturado, então o shell não tem como salvar nada na saída.

A maioria das outras abordagens envolve a limpeza após o fato (ou seja, depois que os dados já atingiram o disco), o que tem muito mais chance de erro (falta de uma cópia), especialmente se o sistema estiver usando btrfs ou similar.


23



+1, não apenas mais chance de erro pode mesmo ser recuperável dependendo se / quantos comandos foram executados depois - Cruncher
Falta a palavra "automaticamente"? Porque dotancohen mostrou uma maneira de salvar o histórico sem sair do shell. - Ben Voigt
O shell pode ser configurado para salvar o histórico depois que cada comando é executado, em vez de na saída. - Kundor
+1 Isso é exatamente o que eu queria recomendar! Além disso rm ~/.bash_history~ para remover o arquivo de backup no caso do OP quando ele já foi salvo - Tomas
Esteja ciente de que isso não funcionará se você tiver definido "PROMPT_COMMAND = history -a". Com isso, o comando com sua senha é imediatamente gravado em sua .bash_history quando o prompt é exibido após o término do comando. Você terá que editar sua .bash_history para removê-la. - benrifkah


Depois que você acidentalmente digitou algo que não queria armazenar no histórico, você pode digitar: unset HISTFILE

O Bash não saberá onde armazenar o histórico quando você estiver efetuando logoff, então, efetivamente, isso desativará o registro em log do histórico de toda a sessão.


11



Esteja ciente de que isso não funcionará se você tiver definido "PROMPT_COMMAND = history -a". Com isso, o comando com sua senha é imediatamente gravado em sua .bash_history quando o prompt é exibido após o término do comando. Você terá que editar sua .bash_history para removê-la. - benrifkah


Meu truque favorito para isso é acertar a seta para cima, retroceder sobre o comando, digitar algo (pode não ser necessário), clicar na seta para baixo, digitar "ls" e apertar enter. Parece realmente piegas, mas na verdade funciona. Descobri isso quando fiquei irritado depois de editar o comando errado no meu histórico e, em seguida, arruiná-lo, não pressionando ctrl-c para abortar a edição. Eu acho que o bash suporta a história revisionista. ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

Parece:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 

10



Isso é esquisito. Uma desvantagem é que parece saber que você editou o histórico, então pode haver alguma maneira de restaurar a versão antiga? - MadTux
@MadTux - Totalmente, mas o .bash_history é apenas um arquivo de texto simples. Então você pode fazer o exemplo acima, sair e se reconectar. Quando você visualiza o conteúdo completo do arquivo .bash_history, não há nada que o diferencie de se você tivesse acabado de executar "cd", então a trilha está limpa. - Mark Jerde
Esteja ciente de que isso não funcionará se você tiver definido "PROMPT_COMMAND = history -a". Com isso, o comando com sua senha é imediatamente gravado em sua .bash_history quando o prompt é exibido após o término do comando. Você terá que editar sua .bash_history para removê-la. - benrifkah


Além das outras respostas, pode ser relevante que a senha também seja encontrada no buffer de rolagem do terminal - o histórico do texto exibido - agora, e, mais um problema, possivelmente no disco rígido, se o emulador de terminal salvou o história para o disco. Isso acontece no KDE, se o tamanho do histórico estiver configurado para "scrollback ilimitado", para nunca descartar nenhuma saída.


10





Com $<space> command, um comando não é adicionado ao histórico, às vezes útil

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep

5



Embora interessante, não está claro como isso é útil no cenário descrito. Você está sugerindo que toda senha deve começar com um espaço? - Ben Voigt
Não, o que ele está sugerindo é que, com isso no lugar, qualquer linha que você digita e que não deseja que esteja comprometida com a história, deve ser digitada com um espaço de liderança. Por exemplo: "ls" se torna "ls" e essa linha nunca é exibida no histórico ou na sua lista de seta para cima. - Bryan C.
Observe que esse truque de espaço líder funciona somente se $ HISTCONTROL contiver ignorespace. - Bernd Jendrissek
@ jris198944 O fornecimento de uma senha por meio de um argumento de linha de comando poderia expô-la a qualquer pessoa no sistema que executasse ps. - jamesdlin
E, de qualquer forma, enquanto esse truque é útil se você planeja com antecedência, isso não ajuda o cenário original em que alguém acidentalmente digitou uma senha em uma linha de comando. - jamesdlin