Sunucuda bir ssh yetkili anahtarını kaldırma komutu


30

Sunucudaki bir ssh anahtarını kaldırmak için bir komut (veya bir liner) var mı? Ssh-copy-id'nin tersi gibi bir şey mi?


2
Bazı SSH sunucu yazılımı, yetkili SSH anahtarlarını yönetmek için RFC 4819 protokolünü destekler, ancak çok nadiren görülür: Linux'ta neredeyse yoktur :(
grawity

3
Mükemmel bir soru, bu anahtar dönüşü kolaylaştırmak için ssh-copy-id işlevinde gerçekten eksik.
Zabuzzman

1
Anahtarları kaldırmak ssh-keygeniçin bir -Rseçenek sunarknown_hosts , ancak ne yazık ki ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysişe yaramazsa dikkat çekiyor . Bunun sedyerine aşağıdaki seçeneği kullanırdım.
Dijital Travma

Yanıtlar:


10

Ignatio'nun önerdiği gibi, bununla yapılabilir grep -v.

Burada başka bir anahtar kalmadığında dosyayı içeren anahtarı kaldıran some unique stringveya authorized_keysdosyayı silen bir örnek .

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 stringKaldırmak istediğiniz anahtarda yalnızca var olan bir şeyle değiştirin .

Ssh üzerinde bir oneliner olarak bu olur

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) ve HP-UX üzerinde test edilmiştir.


2
cevabı aşağıya bakın: sedBunu yaparken daha iyidir
woohoo

25

sed kompakt bir çözüm sunar:

sed -i.bak '/REGEX_MATCHING_KEY/d' ~/.ssh/authorized_keys

Bu orijinal kurtaracak authorized_keysiçinde authorized_keys.bak. Yedekleme istemiyorsanız sonra sadece değiştirmek -i.bakiçin -i.

Birden fazla anahtarı bile kaldırabilirsiniz:

sed -i.bak '/REGEX1/d; /REGEX2/d' ~/.ssh/authorized_keys

Buradaki tek zor bit , regex'teki özel karakterlerden kaçmak gerekiyor .


Base64 karakterlerini yalnızca genel ana dosyadaki (örn. awk '{print $2}' ~/.ssh/id_rsa.pub) Kullanıyorsanız , o zaman özel karakterlerden kaçma konusunda endişelenmenize gerek yoktur.
Juan

7

Hayır! Anahtarı dosyadan çıkarmak için SSH kullanmanız sedveya kullanmanız gerekir grep.


Teşekkür ederim. Birisinin ssh-copy-
id'nin

@grm: Soruyu sonsuza kadar açık tutmanızı veya en azından bir ssh-undo-copy-id uygulanana kadar öneririm! ;-)
Max L. 18:

0

Phil bu soruyu çoktan cevapladı, ancak ben de ekleme yapmak ve sizin için kolaylaştırmak istiyorum. Ve ssh-copy-id'nin tersini istediğinden beri, onu yetkili makinede çalıştırmak istediğini sanıyorum.

ssh tuşları sadece base64 karakter içeriyor . Yani bir char o listede olmayan sed sınırlayıcı olarak kullanabilirsiniz. '#' Kullanalım.

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

Ana bilgisayar adını sunucu IP'si ile değiştirin.

PasswordAuthentication seçeneği, şifre isterse ssh'nin başarısız olmasına neden olur


Pub anahtarındaki 'yorum' base64 karakter içermeyebilir. Bir "#" varsa, o zaman örneğiniz kesilir. Belki bir awk '{print $2}' ~/.ssh/id_rsa.pubkısmıyla sedveya grep -vyerine kullanın.
Juan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.