Команда для удаления авторизованного ключа ssh на сервере


30

Есть ли команда (или однострочная) для удаления ключа ssh на сервере? Что-то вроде противоположности ssh-copy-id?


2
Некоторое программное обеспечение сервера SSH поддерживает протокол RFC 4819 для управления авторизованными ключами SSH, но это настолько редко, что его практически нет в Linux :(
grawity

3
Отличный вопрос, это действительно отсутствует функциональность ssh-copy-id для облегчения вращения клавиш.
Забуцман

1
Стоит отметить, что ssh-keygenпредоставляет -Rвозможность удаления ключей known_hosts, но, к сожалению ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keys, не работает. Я бы использовал sedопцию ниже.
Цифровая травма

Ответы:


10

Как предположил Игнатио, это можно сделать с помощью grep -v.

Вот пример, который удаляет ключ, содержащий some unique stringили просто удаляет authorized_keysфайл, когда другой ключ не остается.

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

Замените some unique stringна то, что существует только в ключе, который вы хотите удалить.

Как односложный по SSH это становится

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'

Протестировано на Linux (SLES) и HP-UX.


2
см. ответ ниже: sedлучше делать это
woohoo

25

sed обеспечивает компактное решение:

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

Это сохранит оригинал authorized_keysв authorized_keys.bak. Если вы не хотите резервное копирование, просто измените -i.bakна -i.

Вы даже можете удалить несколько ключей:

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

Единственный хитрый момент - специальные символы в регулярном выражении, которые необходимо экранировать .


Если вы используете только символы base64 в файле открытого ключа (например, awk '{print $2}' ~/.ssh/id_rsa.pub), вам не нужно беспокоиться о экранировании каких-либо специальных символов.
Хуан

7

Нет. Вам нужно будет ввести SSH и использовать sedили grepудалить ключ из файла.


Спасибо. Я буду держать вопрос открытым немного дольше, чтобы увидеть, может ли кто-то также предоставить сценарий, который делает противоположность ssh-copy-id
grm

@grm: Я бы посоветовал вам оставить вопрос открытым навсегда, или, по крайней мере, до тех пор, пока не будет реализован ssh-undo-copy-id! ;-)
Макс Л.

0

Фил уже ответил на этот вопрос, но я хочу сделать дополнение и сделать его проще для вас. И поскольку вы запрашиваете обратный ssh-copy-id, я предполагаю, что вы хотите запустить его на авторизованном компьютере.

Ключи ssh содержат только символы base64 . Таким образом, вы можете использовать символ как разделитель, которого нет в этом списке. Давайте использовать «#».

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

Замените имя хоста на IP-адрес сервера.

Опция PasswordAuthentication приведет к сбою ssh, если он спросит пароль


«Комментарий» в ключе публикации может не содержать символов base64. Если у него есть «#», то ваш пример ломается. Может быть, использовать awk '{print $2}' ~/.ssh/id_rsa.pubс некоторыми sedили grep -vвместо.
Хуан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.