Digitei a senha acidentalmente na linha de comando do bash

189

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

O que fiz foi editar .bash_historye excluir a linha incorreta (tive que fazer login novamente uma vez para ver a senha aparecer no arquivo para que eu pudesse excluí-la e fazer login novamente para ver 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.

MaDa
fonte
59
Basta alterar a senha :)
gronostaj
96
Alterar a senha não é tão simples ... eu precisaria pedir ao administrador para reinstalar minha nova chave pública em 15 servidores diferentes - e o cara é como /dev/null.
mada
71
Se você não puder alterar sua senha facilmente a qualquer momento, poderá ter uma brecha grave na segurança. O que você fará quando alguém realmente receber sua senha? Você tem algum meio de revogar imediatamente o acesso ao sistema?
gronostaj
42
Você pode alterar a senha de uma chave ssh sem alterar a chave: ssh-keygen -f id_rsa -p.
Jwg /
6
Basta entrar para mencionar que, pelo menos nos logins em rede do Windows, você está hospedado. O padrão do administrador (em alguma torre elevada de servidores) é registrar todas as tentativas de login e, é claro, os nomes de usuário são em texto não criptografado. 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 alterar sua senha.
Carl Witthoft

Respostas:

184

Você pode remover apenas a linha incorreta do bashhistórico, em vez de limpar o histórico inteiro. Simplesmente remova a linha com a -dbandeira e salve (escreva) o novo histórico com a -wbandeira:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
dotancohen
fonte
1
Esteja ciente de que isso não funcionará se você tiver definido "PROMPT_COMMAND = history -a". Com isso, o comando com sua senha é gravado imediatamente em seu .bash_history quando o prompt é exibido após o término do comando. Você precisará editar seu .bash_history para removê-lo.
precisa saber é o seguinte
1
Observe também que, se a linha foi gravada no arquivo hostory, e mais tarde vários shells (janelas de terminal) foram abertos, TODOS os shells o terão no histórico! Você precisará removê-lo de todas essas conchas, ou pelo menos do histórico da ÚLTIMA concha que você fechar! Melhor obtê-lo antes que exista o shell que o usou. A história ao lidar com várias conchas pode se tornar um pesadelo.
anthony
121

Existem duas partes para isso:

  • basharmazena o histórico em um arquivo ~/.bash_historyque, por padrão, é gravado no final da sessão
  • o historyque é mantido na memória

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

history -c

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

> ~/.bash_history

Se a sua sessão na qual você digitou a senha ainda estiver aberta, outra maneira de cobrir seu rastreio é definir a HISTFILEvariável para o dispositivo nulo para que o histórico não seja gravado ~/.bash_historyquando a sessão terminar:

export HISTFILE=/dev/null
devnull
fonte
205
Ei, olha, é o administrador!
Raystafarian
5
Chalaça não intencional, desculpe :) Eu não estava olhando para o seu nick quando estava escrevendo meu comentário.
mada
7
Para ser paranóico (e ainda assim, por algum motivo, ainda não alterar sua senha), você não deve shredsubstituí-lo ou substituí-lo várias vezes?
Kojiro #
1
@MaDa Sem problemas. Eu até adicionei outra maneira na resposta para trazer meu apelido para a foto.
devnull
5
A configuração HISTFILE=é suficiente. De bash(1): se não estiver definido, o histórico de comandos não será salvo quando um shell sair.
Lekensteyn
23

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

kill -9 $$

Isso mata o shell SIGKILL, que não pode ser capturado, portanto 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, após os dados já terem atingido o disco), que tem muito mais chances de erro (falta de uma cópia), especialmente se o sistema estiver usando btrfs ou similar.

R ..
fonte
2
+1, não apenas mais chance de erro, ele pode até mesmo ser recuperável dependendo se / como muitos comandos foram executados após ele
Cruncher
Faltando a palavra "automaticamente"? Porque o dotancohen mostrou uma maneira de salvar a história sem sair do shell.
Ben Voigt
3
O shell pode ser configurado para salvar o histórico após a execução de cada comando, em vez de sair.
Nick Matteo
1
+1 É exatamente isso que eu queria recomendar! Além rm ~/.bash_history~de remover o arquivo de backup no caso do OP, quando 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 é gravado imediatamente em seu .bash_history quando o prompt é exibido após o término do comando. Você precisará editar seu .bash_history para removê-lo.
precisa saber é
11

Depois de digitar acidentalmente algo que não deseja que seja armazenado no histórico, você pode digitar: unset HISTFILE

O Bash não saberá onde armazenar o histórico quando você estiver desconectado; portanto, isso desativará o registro do histórico durante toda a sessão.

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

Meu truque favorito para isso é pressionar a seta para cima, retroceder sobre o comando, digitar algo (pode não ser necessário), pressionar a seta para baixo, digitar "ls" e pressionar enter. Parece realmente hokey, mas realmente funciona. Descobri isso quando fiquei aborrecido depois de editar o comando errado no meu histórico e depois arruiná-lo ao não pressionar 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
$ 
Mark Jerde
fonte
Isso é estranho . Uma desvantagem é que parece saber que você editou o histórico; portanto, 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 reconectar. Quando você visualiza o conteúdo completo do arquivo .bash_history, não existe nada que o diferencie se você tivesse acabado de executar o "cd", para que a trilha fique limpa.
precisa saber é o seguinte
Esteja ciente de que isso não funcionará se você tiver definido "PROMPT_COMMAND = history -a". Com isso, o comando com sua senha é gravado imediatamente em seu .bash_history quando o prompt é exibido após o término do comando. Você precisará editar seu .bash_history para removê-lo.
precisa saber é
10

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órico para o disco. Isso acontece no konsole do KDE, pois o tamanho do histórico é definido como "scrollback ilimitado", para nunca descartar nenhuma saída.

Volker Siegel
fonte
6

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

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
jris198944
fonte
2
Embora interessante, não está claro como isso é útil no cenário descrito. Você está sugerindo que toda senha comece com um espaço?
Ben Voigt
1
Não, o que ele está sugerindo é que, com isso em prática, qualquer linha digitada que você não queira comprometer com a história deve ser digitada com um espaço à frente. por exemplo: "ls" se torna "ls" e essa linha nunca aparece no histórico ou na lista de seta para cima de suas sessões.
Bryan C.
4
Observe que esse truque no espaço à esquerda funciona apenas se $ HISTCONTROL contiver espaço para ignorar.
Bernd Jendrissek
2
@ jris198944 O fornecimento de uma senha por meio de um argumento da linha de comando pode expô-la a qualquer pessoa no sistema que executa ps.
jamesdlin
2
De qualquer forma, embora esse truque seja útil se você estiver planejando 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 # 7/14
4

Outra alternativa para evitar salvar no arquivo de histórico (antes de sair) é simplesmente

chmod 400 ~/.bash_history 

e depois saia. Pare de gravar o histórico no arquivo (já que o arquivo é somente leitura), para que toda a sessão do bash seja descartada e o histórico anterior mantido.

Faça login novamente e redefina as permissões para 600(ou não, dependendo de como você é paranóico!).

Adão
fonte
1

Vejo repetidamente mencionado

Esteja ciente de que isso não funcionará se você tiver definido "PROMPT_COMMAND = history -a" [..] Você precisará editar seu .bash_history para removê-lo.

A primeira parte é definitivamente verdadeira, mas você não precisa recorrer à edição manual de .bash_history para corrigi-lo. Se você combinar os dois comandos em uma linha, funcionará perfeitamente:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w
Floris Kruisselbrink
fonte
Você poderia explicar o que exatamente faz esse método funcionar?
Kamil Maciorowski
O PROMPT_COMMAND é executado apenas antes de exibir o próximo prompt de comando. O problema ao inserir os comandos -d e -w em linhas separadas é que o PROMPT_COMMAND executará o histórico -a comando no meio. Se você executar os comandos -d e -w em uma linha de comando, ele será executado somente depois
Floris Kruisselbrink
0

Muitas das respostas aqui tentam remover o comando em questão do histórico da sessão atual antes de ser gravado em $HISTFILE(~ / .bash_history por padrão). No entanto, se você definiu PROMPT_COMMAND=history -a o comando com sua senha, ela será gravada imediatamente $HISTFILEquando o prompt for exibido após o término do comando. Você precisará editar o seu $HISTFILEpara removê-lo.

Essa configuração é comumente usada para intercalar comandos de várias sessões do bash aberto .

benrifkah
fonte
-3

Você também deve verificar os logs do syslog. Logins inválidos geralmente serão registrados no syslog.

/ var / log / messages ou o equivalente ao seu sistema operacional.

bcarroll
fonte
1
O problema não é que ele digitou uma senha incorretamente, ele já estava logado e digitou sua senha no prompt e pressione enter. Isso não será exibido no arquivo de mensagens.
precisa saber é