SSHのknown_hostsファイルから特定のホストキーを削除することはできますか?


310

SSHのknown_hostsファイルから特定のホストキーを削除することはできますか?

私は通常、known_hostsファイル全体を削除することになりますが、これには何の問題もありませんが、好奇心から、単一のエントリだけを削除することは可能ですか?

known_hostsファイルを開きましたが、その内容を理解するのに苦労しています。

以下は、私がこの質問をするようになったメッセージです。

Add correct host key in /home/wissen16/.ssh/known_hosts to get rid of this message.
Offending key in /home/wissen16/.ssh/known_hosts:1
RSA host key for foo.com has changed and you have requested strict checking.
Host key verification failed.

回答:


515

このコマンドを使用して、known_hostsからエントリを削除します。

ssh-keygen -R hostname

21
IPアドレスでも機能します。たとえば、WebサーバーのDNSホストショートカットがあります。カスタムホスト名のキーとIPアドレスの間にある競合を削除するには、両方のエントリを削除する必要があったので、ssh-keygen -R xxx.xxx.xxx.xxx
StrangeElement

@StrangeElementが言うように、ホスト名とは別にIPホストも削除する必要がある場合があります。
ゴンサロカオ

4
さらに、バックアップを自動的に保持します(私のosxマシンOriginal contents retained as /Users/nha/.ssh/known_hosts.oldでは、Ubuntuでも同じであると仮定しています)。
ニャ

17
さらに、あなたは、このフォーマットを使用し、非標準のsshのポートを使用している場合ssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J

この質問に対する史上最高の答え。チャームのように
動作します-bademba

32

はい、1つのキーのみを削除できます。エディタで開いて問題のある行を削除するだけです。エラーメッセージのコロンの後の番号は行番号です。これが削除する行です。例では1行目です。


1
行番号を特定できたとは思いもしませんでしたが、これは非常に役立ちます。
デルツリー

19

ホストキーを使用し始めたのはごく最近のことですが、それらを台無しにした場合、通常は1行につき1つのキーであるため、ファイルをバックアップし、適切なキーが見つかるまで1つずつ削除します。その後、他を追加し直します。少し長い道のりですが、うまくいくはずです。

また、そのエラーに基づいており、何が起こるかわからないため、問題のファイル内の最初のホストキーになる可能性があるため、vimでファイルを開きます

vim ~/.ssh/known_hosts

ヒット

dd

それを保存します。


vimで:set nuを使用して行番号を表示できます。とにかくTakkatの答えは最高です。
ハビエルリベラ

私はあなたがそれができるとは知らなかったことに同意します。将来的に使用する予定です。私は、vimの行番号設定を検索することを意味し続けました。ありがとう。
バディリンジー

3

ssh-keygen -R hostnameを使用しても常に機能するとは限りません。ssh-agentハイジャックを防ぐためにホスト名を「隠す」新しいバージョンのSSHがある場合、明らかにssh-keygenはホスト名をハッシュ解除できません。

たとえば、build-node-01というホストがあり、そのホストに接続してキーを受け入れました。その後、ゼロから再構築し、新しいホストフィンガープリントを取得して再接続しようとすると、行Xで競合があるという警告が表示されます(3行目など)。を実行しますssh-keygen -R hostnameが、次に接続しようとすると、まだ競合があるという警告が表示されます。ホスト名がハッシュされ[1] Bu4Ch@R@4D0M57uFF、読み取り可能なホスト名の代わりに表示されることを発見するためだけにファイルを調べました。

この場合、問題のあるホストを正常に削除する唯一の方法は、

sed -i 'xd' ~/.ssh/known_hosts

このsedをさらに一歩進めるには、間違った行を削除した場合にknown_hostsのバックアップを作成します。この場合、-iオプションに.bak(または任意の拡張子)を追加して、そのバックアップを作成します。拡張。ssh-keygenを使用すると、これが自動的に行われます。

sed -i.bak 'xd' ~/.ssh/known_hosts

5
これは正しくありません。ssh-keygen -R {hostname}ホスト名が「隠されている」(ハッシュされている)場合でも機能します。それでも、はい、番号でエントリを削除できます(たとえば、10番目のエントリを使用sed -i.bak 10d ~/.ssh/known_hosts)が、通常は必要ありません。これは、その場合には、あなたが(ノート引用符)などのコマンドをフォーマットする必要があり、非標準のポートを使用したことが考えられます:ssh-keygen -R '[hostname]:2222'
マイケル・

@michael_nを知っておくと、エントリを削除する機能に影響を与えたのは非標準ポートである可能性が非常に高くなります。また、ホストに対して複数のフィンガープリントを受け入れた場合、一度にすべてのエントリを削除するのか、一度に1つだけ削除するのかはわかりません。
dragon788

1

私が見つけた別の簡潔で簡単な答えを共有するだけです。known_hostsファイルがハッシュ化されているため、ホスト名を削除することは私にとって重要です。ただし、エラーメッセージの行番号に基づいてホストエントリを手動で編集できます。Mike Scottが以前に指摘したように、問題のホスト名の行番号はエラーメッセージにあります。

または、私はこれを行うことができます。ここから:ssh known_hostsファイルで問題のあるキーを修正する方法

ちょっとしたクリマジック

sed -i 'xd' ~/.ssh/known_hosts

xを行番号に置き換えて、出来上がり。また、sedが機能しない場合は、perlの回答を提供します。


0
sed '/10\.20\.120\.211/d' ~/.ssh/known_hosts > temp && mv temp ~/.ssh/known_hosts

この場合、10.20.120.211がknown_hostsファイルから削除するホストです。(。)などの特殊文字を必ずエスケープしてください。


IPアドレスとホスト名は、既知のホストファイルにそのまま(クリアテキスト)格納されないため、これは機能しません。どちらかを使用する必要がありますssh-keygen -R ...(できれば)。または、sed削除する特定の行番号を使用します。また、sedインプレースするには、-i' option; e.g., sed -i.bak 10d〜/ .ssh / known_hosts`を使用して10行目を削除し、(オプションで)をサフィックスとして付けたバックアップファイルに元のファイルを保持します.bak
マイケル

0

更新することにより、特定のホストの削除を回避できます。

ssh-keyscan -t ecdsa hostname >> ~/.ssh/known_hosts

この方法では、ホストに再度接続する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.