Polecenie usunięcia autoryzowanego klucza ssh na serwerze

30

Czy istnieje polecenie (lub jedna linijka), aby usunąć klucz ssh na serwerze? Coś w rodzaju przeciwieństwa ssh-copy-id?

grm
źródło
2
Niektóre oprogramowanie serwera SSH obsługuje protokół RFC 4819 do zarządzania autoryzowanymi kluczami SSH, ale jest tak rzadki, że prawie nie istnieje w systemie Linux :(
grawity
3
Doskonałe pytanie, tak naprawdę brakuje funkcji ssh-copy-id, aby ułatwić rotację klawiszy.
Zabuzzman
1
Warto zauważyć, że ssh-keygenzapewnia -Ropcję usuwania kluczy known_hosts, ale niestety ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysnie działa. sedZamiast tego skorzystałbym z opcji poniżej.
Digital Trauma

Odpowiedzi:

10

Jak zasugerował Ignatio, można tego dokonać grep -v.

Oto przykład, który usuwa klucz zawierający some unique stringlub po prostu usuwa authorized_keysplik, gdy nie pozostaje żaden inny klucz.

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

Zamień na some unique stringcoś, co istnieje tylko w kluczu, który chcesz usunąć.

Jako oneliner nad ssh to się dzieje

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'

Testowany na Linux (SLES) i HP-UX.

mleu
źródło
2
patrz poniżej odpowiedź: sedlepiej to zrobić
woohoo,
25

sed zapewnia kompaktowe rozwiązanie:

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

Spowoduje to zapisanie oryginału authorized_keysw authorized_keys.bak. Jeśli nie chcesz kopii zapasowej, po prostu zmień -i.bakna -i.

Możesz nawet usunąć wiele kluczy:

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

Jedyną trudną kwestią jest to, że znaki specjalne w wyrażeniu regularnym muszą zostać usunięte .

Phil Frost
źródło
Jeśli użyjesz tylko znaków base64 w publicznym pliku kluczy (np. awk '{print $2}' ~/.ssh/id_rsa.pub), Nie musisz się martwić o uniknięcie znaków specjalnych.
Juan
7

Nie. Musisz zalogować się SSH i użyć sedlub grepusunąć klucz z pliku.

Ignacio Vazquez-Abrams
źródło
Dziękuję Ci.
Pozostawię
@grm: Sugerowałbym, aby pozostawić pytanie otwarte na zawsze, a przynajmniej dopóki nie zostanie zaimplementowany identyfikator ssh-undo-copy-id! ;-)
Max L.
0

Phil już odpowiedział na to pytanie, ale chcę dodać i ułatwić ci to. A ponieważ pytasz o odwrócenie ssh-copy-id, zakładam, że chcesz uruchomić go na autoryzowanym komputerze.

Klucze ssh zawierają tylko znaki base64 . Możesz więc użyć znaku jako ogranicznika sed, którego nie ma na tej liście. Użyjmy „#”.

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

Zastąp nazwę hosta adresem IP serwera.

Opcja PasswordAuthentication spowoduje, że ssh nie powiedzie się, jeśli poprosi o hasło

ibrahim
źródło
„Komentarz” w kluczu pub może nie zawierać znaków base64. Jeśli ma „#”, twój przykład się zepsuje. Może używać awk '{print $2}' ~/.ssh/id_rsa.pubz niektórymi sedlub grep -vzamiast tego.
Juan