42 votes

Commande pour supprimer une clé autorisée ssh sur le serveur

Y a-t-il une commande (ou une ligne de commande) pour supprimer une clé SSH sur un serveur ? Quelque chose comme l'opposé de ssh-copy-id ?

38voto

Phil Frost Points 570

sed fournit une solution compacte :

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

Cela sauvegardera l'original authorized_keys dans authorized_keys.bak. Si vous ne voulez pas la sauvegarde, changez juste -i.bak en -i.

Vous pouvez même supprimer plusieurs clés :

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

La seule partie délicate ici est que les caractères spéciaux dans la regex doivent être échappés.

12voto

mleu Points 244

Tel que Ignatio l'a suggéré, cela peut être fait avec grep -v.

Voici un exemple qui supprime la clé contenant some unique string ou supprime simplement le fichier authorized_keys lorsqu'aucune autre clé ne reste.

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

Remplacez some unique string par quelque chose qui n'existe que dans la clé que vous souhaitez supprimer.

En tant que ligne de commande via ssh, cela devient

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'

Testé sur Linux (SLES) et HP-UX.

8voto

Non. Vous devrez vous connecter en SSH et utiliser sed ou grep pour supprimer la clé du fichier.

2voto

Reisclef Points 141

Phil a déjà répondu à cette question mais je veux ajouter quelque chose et le rendre plus facile pour vous. Et puisque vous demandez le contraire de ssh-copy-id, je suppose que vous voulez l'exécuter sur la machine autorisée.

Les clés ssh ne contiennent que des caractères base64. Vous pouvez donc utiliser un caractère comme délimiteur sed qui n'est pas dans cette liste. Utilisons '#'.

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

Remplacez hostname par l'IP du serveur.

L'option PasswordAuthentication provoquera un échec de la connexion ssh si elle demande un mot de passe

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X