Команда для видалення 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 містять лише базові64 символів. Таким чином, ви можете використовувати знак як роздільник sed, який відсутній у цьому списку. Давайте скористаємося "#".

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.