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

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

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

решение1

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

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

if test -f $HOME/.ssh/authorized_keys; then
  temp_file=$(mktemp)
  if grep -v "some unique string" $HOME/.ssh/authorized_keys > $temp_file; then
    cat $temp_file > $HOME/.ssh/authorized_keys && rm $temp_file;
  else
    rm $HOME/.ssh/authorized_keys && rm $temp_file;
  fi;
fi

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

В качестве однострочника по ssh это становится

ssh hostname 'if test -f $HOME/.ssh/authorized_keys; then temp_file=$(mktemp); if grep -v "some unique string" $HOME/.ssh/authorized_keys > $temp_file; then cat $temp_file > $HOME/.ssh/authorized_keys && rm $temp_file; else rm $HOME/.ssh/authorized_keys && rm $temp_file; fi; fi'

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

решение2

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

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

решение3

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

решение4

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

ключи ssh содержат толькоbase64символы. Так что вы можете использовать символ в качестве разделителя sed, которого нет в этом списке. Давайте используем '#'.

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

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

Параметр PasswordAuthentication приведет к сбою ssh, если он запросит пароль

Связанный контент