SSH의 known_hosts 파일에서 특정 호스트 키를 제거 할 수 있습니까?


309

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.

답변:


514

known_hosts에서 항목을 제거하려면이 명령을 사용하십시오.

ssh-keygen -R hostname

21
IP 주소와도 작동합니다. 예를 들어 웹 서버에 대한 DNS 호스트 바로 가기가 있습니다. 사용자 정의 호스트 이름의 키와 IP 주소 사이의 충돌을 제거하려면 두 항목 모두를 제거해야했습니다. ssh-keygen -R xxx.xxx.xxx.xxx.
StrangeElement

@StrangeElement가 말했듯이 언젠가 호스트 이름과 별도로 IP 호스트도 제거해야 할 수도 있습니다.
Gonzalo Cao

4
또한, 자동으로 백업을 유지합니다 (내 OSX 머신에서 : Original contents retained as /Users/nha/.ssh/known_hosts.old우분투와 동일하다고 가정).
nha

17
또한 비표준 ssh 포트를 사용하는 경우이 형식을 사용하십시오ssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J

이 질문에 대한 최고의 답변. 매력처럼 작동
bademba

32

예, 하나의 키만 제거 할 수 있습니다. 편집기에서 파일을 열고 문제의 행을 삭제하십시오. 오류 메시지에서 콜론 뒤의 숫자는 줄 번호이므로 예제에서 삭제할 줄 1입니다.


1
나는 그것이 줄 번호를 식별했는지 전혀 몰랐다. 그것은 매우 도움이되었다.
deltree

19

나는 최근에 호스트 키를 사용하기 시작했지만 그것들을 엉망으로 만들면 일반적으로 한 줄에 하나의 키이므로 파일을 백업하고 올바른 것을 찾을 때까지 한 번에 하나씩 제거하십시오. 그런 다음 다른 것을 다시 추가하십시오. 그것을 할 수있는 먼 길이지만 작동해야합니다.

또한 그 오류를 기반으로, 그리고 지금까지 무엇을 알지 못하더라도 파일의 첫 번째 호스트 키가 문제가 될 수 있으므로 vim으로 파일을여십시오.

vim ~/.ssh/known_hosts

그리고 명중

dd

그런 다음 저장하십시오.


vim에서 : set nu를 사용하여 줄 번호를 표시 할 수 있습니다. Takkat 답변은 어쨌든 가장 좋습니다.
Javier Rivera 2012 년

당신이 그렇게 할 줄 몰랐어요 앞으로 사용할 예정입니다. vim의 줄 번호 설정을 조회하는 것을 의미했습니다. 감사.
버디 린지

3

ssh-keygen -R 호스트 이름을 사용하는 것이 항상 작동하지는 않습니다. 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를 백업 할 수 있습니다.이 경우 .bak (또는 확장자)를 -i 옵션에 추가하여 백업을 작성하십시오. 신장. ssh-keygen을 사용하면 자동으로 수행됩니다.

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

5
이것은 정확하지 않습니다. ssh-keygen -R {hostname}호스트 이름이 '숨겨진'(해시) 경우에도 작동합니다. 그래도 예를 들어 번호로 항목을 삭제할 수 sed -i.bak 10d ~/.ssh/known_hosts있지만 (예 :를 통해 10 번째 항목 ) 일반적으로 필요하지는 않습니다. 비표준 포트가 사용되었을 수 있습니다.이 경우 명령을 다음과 같이 형식화해야 할 수도 있습니다. (따옴표) :ssh-keygen -R '[hostname]:2222'
michael

@michael_n을 ​​아는 것이 좋지만, 비표준 포트가 항목을 제거하는 능력에 영향을 미쳤을 가능성이 큽니다. 또한 호스트에 대해 여러 개의 지문을 허용 한 경우 모든 항목을 한 번에 제거할지 한 번에 하나씩 만 제거할지 확실하지 않습니다.
dragon788

1

방금 찾은 또 다른 깨끗하고 쉬운 답변을 공유하기 위해. known_hosts 파일이 해시되므로 호스트 이름을 제거 할 수 없습니다. 그러나 오류 메시지의 줄 번호를 기준으로 호스트 항목을 수동으로 편집해야합니다. Mike Scott이 이전에 언급했듯이 문제가되는 호스트 이름 줄 번호는 오류 메시지에 있습니다.

아니면 할 수 있어요 여기에서 : ssh known_hosts 파일에서 위반 키를 수정하는 방법

나는이 cli 마술을 얻었다

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

x를 줄 번호로 바꾸십시오. 그는 또한 sed가 작동하지 않으면 펄 답변을 제공합니다.


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.