サーバー上のssh認証キーを削除するコマンド


30

サーバー上のsshキーを削除するコマンド(またはワンライナー)はありますか?ssh-copy-idの反対のようなものですか?


2
一部のSSHサーバーソフトウェアは、承認済みのSSHキーを管理するためにRFC 4819プロトコルをサポートしていますが、Linuxではほとんど存在しないことはめったにありません:(
grawity

3
すばらしい質問です。これは、キーのローテーションを容易にするssh-copy-idの機能が本当に欠落しています。
ザブズマン

1
注目に値することssh-keygenは、-Rキーをから削除するオプション提供しますknown_hostsが、残念ながらssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keys機能しません。sed代わりに、以下のオプションを使用します。
デジタル外傷

回答:


10

Ignatioが示唆したように、これはで行うことができます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上のonelinerとして、これは

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_keysauthorized_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を使用し、ファイルからキーを使用するsedgrep、キーを削除する必要があります。


ありがとうございました。ssh-copy-id
grm

@grm:質問を永久に、または少なくともssh-undo-copy-idが実装されるまでオープンにしておくことをお勧めします!;-)
マックスL.

0

フィルはすでにこの質問に答えましたが、私はあなたに追加をしてそれをより簡単にしたいと思います。そして、あなたはssh-copy-idの逆を要求しているので、許可されたマシン上でそれを実行したいと思っています。

sshキーにはbase64文字のみが含まれます。したがって、そのリストにないsed区切り文字としてcharを使用できます。「#」を使用しましょう。

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

ホスト名をサーバーIPに置き換えます。

PasswordAuthenticationオプションは、パスワードを要求するとsshが失敗する原因になります


pubキーの「コメント」にbase64文字が含まれていない可能性があります。「#」がある場合、サンプルは壊れています。たぶんawk '{print $2}' ~/.ssh/id_rsa.pub、いくつかsedまたはgrep -v代わりに使用してください。
フアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.