서버에서 SSH 인증 키를 제거하는 명령


28

서버에서 ssh 키를 제거하는 명령 (또는 하나의 라이너)이 있습니까? ssh-copy-id의 반대와 같은 것?


2
일부 SSH 서버 소프트웨어는 승인 된 SSH 키를 관리하기 위해 RFC 4819 프로토콜을 지원하지만 Linux에는 거의 존재하지 않는 경우가 거의 없습니다. (
grawity

3
훌륭한 질문은 키 회전을 용이하게하기 위해 ssh-copy-id에 실제로 누락 된 기능입니다.
Zabuzzman

1
그 지적 그것의 가치는 ssh-keygen제공한다 -R옵션 에서 키를 제거를 known_hosts슬프게하지만, ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keys작동하지 않습니다. sed대신 아래 옵션 을 사용하십시오 .
Digital Trauma

답변:


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_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특수 문자를 이스케이프 처리 할 필요가 없습니다.
Juan

6

아니. SSH를 사용 하여 파일에서 키를 사용 sed하거나 grep제거해야합니다.


고맙습니다. 누군가는 ssh를 복사-ID의 반대를 수행하는 스크립트를 제공 할 수 있는지 확인하기 위해 질문은 조금 더 열어 둘 것
GRM

@grm : 질문을 영원히 열어 두거나 적어도 ssh-undo-copy-id가 구현 될 때까지 계속 제안하십시오! ;-)
최대 L.

0

Phil은 이미이 질문에 대답했지만 추가 작업을 더 쉽게하고 싶습니다. 그리고 당신은 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에 실패합니다


pub 키의 'comment'에는 base64자가 없을 수 있습니다. "#"이 있으면 예제가 중단됩니다. 어쩌면 awk '{print $2}' ~/.ssh/id_rsa.pub일부 sed또는 grep -v대신 사용할 수도 있습니다 .
Juan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.