Alguns suporte de software servidor SSH o protocolo RFC 4819 para o gerenciamento de chaves SSH autorizadas, mas é tão raro é quase inexistente no Linux :(
grawity
3
Excelente pergunta, isso realmente está faltando funcionalidade no ssh-copy-id para facilitar a rotação das teclas.
Zabuzzman
1
Vale a pena notar que ssh-keygenisso fornece a -Ropção para remover chaves de known_hosts, mas infelizmente ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysnão funciona. Eu usaria a sedopção abaixo.
Digital Trauma
Respostas:
10
Como Ignatio sugeriu, isso pode ser feito grep -v.
Aqui está um exemplo que remove a chave que contém some unique stringou simplesmente exclui o authorized_keysarquivo quando nenhuma outra chave permanece.
if test -f $HOME/.ssh/authorized_keys; then
if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then
cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
else
rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
fi;
fi
Substitua some unique stringpor algo que só existe na chave que você deseja remover.
Como um delineador sobre ssh, isso se torna
ssh hostname 'if test -f $HOME/.ssh/authorized_keys; then if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; else rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; fi; fi'
Se você usar apenas os caracteres base64 no arquivo de chaves público (por exemplo, awk '{print $2}' ~/.ssh/id_rsa.pub), não precisará se preocupar em escapar de caracteres especiais.
22418 Juan Juan
7
Não. Você precisará fazer o SSH e usar sedou grepremover a chave do arquivo.
Obrigado. Vou manter a questão abra um pouco mais para ver se alguém também pode fornecer um script que faz o oposto do ssh-copy-id
GRM
@grm: sugiro que você mantenha a pergunta em aberto para sempre, ou pelo menos até que um ssh-undo-copy-id seja implementado! ;-)
Max L.
0
Phil já respondeu a essa pergunta, mas eu quero fazer uma adição e facilitar isso para você. E como você está solicitando o reverso do ssh-copy-id, suponho que você queira executá-lo em uma máquina autorizada.
As chaves ssh contêm apenas caracteres base64 . Portanto, você pode usar um char como delimitador sed que não está nessa lista. Vamos usar '#'.
O 'comentário' na chave do pub pode não ter caracteres base64. Se tiver um "#", seu exemplo será interrompido. Talvez use awk '{print $2}' ~/.ssh/id_rsa.pubcom alguns sedou em grep -vvez disso.
ssh-keygen
isso fornece a-R
opção para remover chaves deknown_hosts
, mas infelizmentessh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keys
não funciona. Eu usaria ased
opção abaixo.Respostas:
Como Ignatio sugeriu, isso pode ser feito
grep -v
.Aqui está um exemplo que remove a chave que contém
some unique string
ou simplesmente exclui oauthorized_keys
arquivo quando nenhuma outra chave permanece.Substitua
some unique string
por algo que só existe na chave que você deseja remover.Como um delineador sobre ssh, isso se torna
Testado no Linux (SLES) e HP-UX.
fonte
sed
é melhor em fazer issosed
fornece uma solução compacta:Isso salvará o original
authorized_keys
emauthorized_keys.bak
. Se você não deseja o backup, mude-i.bak
para-i
.Você pode até remover várias chaves:
A única parte complicada aqui é que caracteres especiais na regex precisam ser escapados .
fonte
awk '{print $2}' ~/.ssh/id_rsa.pub
), não precisará se preocupar em escapar de caracteres especiais.Não. Você precisará fazer o SSH e usar
sed
ougrep
remover a chave do arquivo.fonte
Phil já respondeu a essa pergunta, mas eu quero fazer uma adição e facilitar isso para você. E como você está solicitando o reverso do ssh-copy-id, suponho que você queira executá-lo em uma máquina autorizada.
As chaves ssh contêm apenas caracteres base64 . Portanto, você pode usar um char como delimitador sed que não está nessa lista. Vamos usar '#'.
Substitua o nome do host pelo IP do servidor.
A opção PasswordAuthentication fará com que o ssh falhe se solicitar a senha
fonte
awk '{print $2}' ~/.ssh/id_rsa.pub
com algunssed
ou emgrep -v
vez disso.