Comando para eliminar una clave autorizada ssh en el servidor

30

¿Hay un comando (o una línea) para eliminar una clave ssh en un servidor? Algo como lo contrario de ssh-copy-id?

grm
fuente
2
Algunos software de servidor SSH son compatibles con el protocolo RFC 4819 para administrar claves SSH autorizadas, pero es tan raro que casi no
existe
3
Excelente pregunta, realmente falta funcionalidad a ssh-copy-id para facilitar la rotación de claves.
Zabuzzman
1
Vale la pena señalar que ssh-keygenofrece la -Ropción de eliminar claves known_hosts, pero lamentablemente ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysno funciona. En su lugar, usaría la sedopción a continuación.
Digital Trauma

Respuestas:

10

Como Ignatio sugirió, esto se puede hacer con grep -v.

Aquí hay un ejemplo que elimina la clave que contiene some unique stringo simplemente elimina el authorized_keysarchivo cuando no queda otra clave.

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

Reemplace some unique stringcon algo que solo existe en la clave que desea eliminar.

Como una línea sobre ssh esto se convierte

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'

Probado en Linux (SLES) y HP-UX.

mleu
fuente
2
vea la respuesta a continuación: sedes mejor para hacer esto
woohoo
25

sed proporciona una solución compacta:

sed -i.bak '/REGEX_MATCHING_KEY/d' ~/.ssh/authorized_keys

Esto guardará el original authorized_keysen authorized_keys.bak. Si no desea la copia de seguridad, simplemente cambie -i.baka -i.

Incluso puedes eliminar varias claves:

sed -i.bak '/REGEX1/d; /REGEX2/d' ~/.ssh/authorized_keys

La única parte difícil aquí es que los caracteres especiales en la expresión regular necesitan escapar .

Phil Frost
fuente
Si solo usa los caracteres base64 en el archivo de clave pública (por ejemplo, awk '{print $2}' ~/.ssh/id_rsa.pub), entonces no necesita preocuparse por escapar de ningún carácter especial.
Juan
7

No Deberá ingresar y usar SSH sedo grepeliminar la clave del archivo.

Ignacio Vazquez-Abrams
fuente
Gracias. Mantendré la pregunta abierta un poco más para ver si alguien también puede proporcionar un script que haga lo contrario de ssh-copy-id
grm
@grm: ¡Te sugiero que mantengas la pregunta abierta para siempre, o al menos hasta que se implemente un ssh-undo-copy-id! ;-)
Max L.
0

Phil ya respondió a esta pregunta, pero quiero agregar y hacer que sea más fácil para usted. Y dado que está solicitando el reverso de ssh-copy-id, supongo que desea ejecutarlo en una máquina autorizada.

Las claves ssh solo contienen caracteres base64 . Entonces puede usar un char como delimitador de sed que no está en esa lista. Usemos '#'.

ssh root@<hostname> -o PasswordAuthentication=no "sed -i.bak 's#`cat ~/.ssh/id_rsa.pub`##' ~/.ssh/authorized_keys"

Reemplace el nombre de host con la IP del servidor.

La opción de autenticación de contraseña hará que ssh falle si solicita contraseña

ibrahim
fuente
El 'comentario' en la clave de publicación puede no tener caracteres base64. Si tiene un "#", entonces su ejemplo se rompe. Tal vez usar awk '{print $2}' ~/.ssh/id_rsa.pubcon algunos sedo en su grep -vlugar.
Juan