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'
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.
@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 „#”.
„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.
ssh-keygen
zapewnia-R
opcję usuwania kluczyknown_hosts
, ale niestetyssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keys
nie działa.sed
Zamiast tego skorzystałbym z opcji poniżej.Odpowiedzi:
Jak zasugerował Ignatio, można tego dokonać
grep -v
.Oto przykład, który usuwa klucz zawierający
some unique string
lub po prostu usuwaauthorized_keys
plik, gdy nie pozostaje żaden inny klucz.Zamień na
some unique string
coś, co istnieje tylko w kluczu, który chcesz usunąć.Jako oneliner nad ssh to się dzieje
Testowany na Linux (SLES) i HP-UX.
źródło
sed
lepiej to zrobićsed
zapewnia kompaktowe rozwiązanie:Spowoduje to zapisanie oryginału
authorized_keys
wauthorized_keys.bak
. Jeśli nie chcesz kopii zapasowej, po prostu zmień-i.bak
na-i
.Możesz nawet usunąć wiele kluczy:
Jedyną trudną kwestią jest to, że znaki specjalne w wyrażeniu regularnym muszą zostać usunięte .
źródło
awk '{print $2}' ~/.ssh/id_rsa.pub
), Nie musisz się martwić o uniknięcie znaków specjalnych.Nie. Musisz zalogować się SSH i użyć
sed
lubgrep
usunąć klucz z pliku.źródło
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 „#”.
Zastąp nazwę hosta adresem IP serwera.
Opcja PasswordAuthentication spowoduje, że ssh nie powiedzie się, jeśli poprosi o hasło
źródło
awk '{print $2}' ~/.ssh/id_rsa.pub
z niektórymised
lubgrep -v
zamiast tego.