Certains logiciels de serveur SSH prennent en charge le protocole RFC 4819 pour gérer les clés SSH autorisées, mais il est si rare qu'il est presque inexistant sous Linux :(
grawity
3
Excellente question, il manque vraiment des fonctionnalités à ssh-copy-id pour faciliter la rotation des clés.
Zabuzzman
1
Il convient de noter que ssh-keygencela offre la -Rpossibilité de supprimer des clés known_hosts, mais ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysne fonctionne malheureusement pas. J'utiliserais sedplutôt l' option ci-dessous.
Digital Trauma
Réponses:
10
Comme Ignatio l'a suggéré, cela peut être fait avec grep -v.
Voici un exemple qui supprime la clé contenant some unique stringou supprime simplement le authorized_keysfichier 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 stringpar quelque chose qui n'existe que dans la clé que vous souhaitez supprimer.
Comme oneliner sur 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'
Si vous n'utilisez que les caractères base64 dans le fichier de clés publiques (par exemple, awk '{print $2}' ~/.ssh/id_rsa.pub), vous n'avez pas à vous soucier d'échapper les caractères spéciaux.
Juan
7
Nan. Vous devrez vous connecter à SSH et utiliser sedou greppour supprimer la clé du fichier.
Merci. Je garderai la question ouverte un peu plus longtemps pour voir si quelqu'un peut également fournir un script qui fait le contraire de ssh-copy-id
grm
@grm: Je vous suggère de garder la question ouverte pour toujours, ou du moins jusqu'à ce qu'un ssh-undo-copy-id soit implémenté! ;-)
Max L.
0
Phil a déjà répondu à cette question mais je veux faire plus et vous faciliter la tâche. Et puisque vous demandez l'inverse 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 char comme délimiteur sed qui ne figure pas dans cette liste. Utilisons '#'.
Le «commentaire» dans la clé de publication peut ne pas avoir de caractères base64. S'il a un "#", alors votre exemple se casse. Peut-être utiliser awk '{print $2}' ~/.ssh/id_rsa.pubavec certains sedou à la grep -vplace.
ssh-keygen
cela offre la-R
possibilité de supprimer des clésknown_hosts
, maisssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keys
ne fonctionne malheureusement pas. J'utiliseraissed
plutôt l' option ci-dessous.Réponses:
Comme 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 leauthorized_keys
fichier lorsqu'aucune autre clé ne reste.Remplacez
some unique string
par quelque chose qui n'existe que dans la clé que vous souhaitez supprimer.Comme oneliner sur ssh, cela devient
Testé sur Linux (SLES) et HP-UX.
la source
sed
est mieux à faire celased
fournit une solution compacte:Cela permettra d'enregistrer l'original
authorized_keys
dansauthorized_keys.bak
. Si vous ne voulez pas la sauvegarde, passez simplement-i.bak
à-i
.Vous pouvez même supprimer plusieurs clés:
Le seul point délicat ici est que les caractères spéciaux dans l'expression régulière doivent être échappés .
la source
awk '{print $2}' ~/.ssh/id_rsa.pub
), vous n'avez pas à vous soucier d'échapper les caractères spéciaux.Nan. Vous devrez vous connecter à SSH et utiliser
sed
ougrep
pour supprimer la clé du fichier.la source
Phil a déjà répondu à cette question mais je veux faire plus et vous faciliter la tâche. Et puisque vous demandez l'inverse 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 char comme délimiteur sed qui ne figure pas dans cette liste. Utilisons '#'.
Remplacez le nom d'hôte par l'IP du serveur.
L'option PasswordAuthentication entraînera l'échec de ssh s'il demande le mot de passe
la source
awk '{print $2}' ~/.ssh/id_rsa.pub
avec certainssed
ou à lagrep -v
place.