Comando per rimuovere una chiave autorizzata ssh sul server


25

Esiste un comando (o un one-liner) per rimuovere una chiave ssh su un server? Qualcosa come il contrario di ssh-copy-id?


2
Alcuni software server SSH supportano il protocollo RFC 4819 per la gestione delle chiavi SSH autorizzate, ma è così raro che è quasi inesistente su Linux :(
grawity

3
Ottima domanda, questa funzionalità in realtà manca a ssh-copy-id per facilitare la rotazione delle chiavi.
Zabuzzman

1
Vale la pena notare questo ssh-keygen fornisce il -R opzione per rimuovere le chiavi da known_hosts, ma purtroppo ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keys non funziona Vorrei usare il sed opzione qui sotto, invece.
Digital Trauma

Risposte:


9

Come ha suggerito Ignatio, questo può essere fatto grep -v.

Ecco un esempio che rimuove la chiave che contiene some unique string o semplicemente elimina il authorized_keys file quando non rimane nessun'altra chiave.

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

Sostituire some unique string con qualcosa che esiste solo nella chiave che desideri rimuovere.

Come oneliner su ssh questo diventa

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'

Testato su Linux (SLES) e HP-UX.


2
vedi sotto risposta: sed è meglio farlo
woohoo

22

sed fornisce una soluzione compatta:

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

Questo salverà l'originale authorized_keys nel authorized_keys.bak. Se non vuoi che il backup cambierà -i.bak a -i.

Puoi persino rimuovere più chiavi:

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

L'unica cosa difficile qui è caratteri speciali nella regex devono essere sfuggiti .


Se si utilizzano solo i caratteri base64 nel file di chiavi pubblico (ad es. awk '{print $2}' ~/.ssh/id_rsa.pub ), quindi non è necessario preoccuparsi di sfuggire a caratteri speciali.
Juan

6

No. Avrai bisogno di usare SSH sed o grep rimuovere la chiave dal file.


Grazie. Terrò la domanda ancora aperta per vedere se qualcuno può anche fornire uno script che faccia l'opposto di ssh-copy-id
grm

@grm: Ti suggerirei di mantenere la domanda aperta per sempre, o almeno finché non viene implementato un ssh-undo-copy-id! ;-)
Max L.

0

Phil ha già risposto a questa domanda, ma voglio aggiungere e renderti più facile. E poiché stai chiedendo il contrario di ssh-copy-id, presumo che tu voglia eseguirlo su una macchina autorizzata.

le chiavi ssh contiene solo Base64 personaggi. Quindi puoi usare un carattere come delimitatore di sed che non è in quella lista. Usiamo '#'.

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

Sostituisci hostname con l'IP del server.

L'opzione PasswordAuthentication causerà l'errore ssh se richiede la password


Il "commento" nella chiave pub potrebbe non avere caratteri base64. Se ha un "#", il tuo esempio si interrompe. Forse usare awk '{print $2}' ~/.ssh/id_rsa.pub con un po sed o grep -v anziché.
Juan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.