Perintah untuk menghapus kunci resmi ssh di server


30

Apakah ada perintah (atau satu-liner) untuk menghapus kunci ssh di server? Sesuatu seperti kebalikan dari ssh-copy-id?


2
Beberapa perangkat lunak server SSH mendukung protokol RFC 4819 untuk mengelola kunci SSH yang diotorisasi, tetapi sangat jarang sehingga hampir tidak ada di Linux :(
grawity

3
Pertanyaan yang sangat bagus, ini benar-benar kehilangan fungsionalitas untuk ssh-copy-id untuk memfasilitasi rotasi tombol.
Zabuzzman

1
Perlu dicatat bahwa ssh-keygenmemang memberikan -Ropsi untuk menghapus kunci dari known_hosts, tetapi sayangnya ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keystidak berfungsi. Saya akan menggunakan sedopsi di bawah ini.
Digital Trauma

Jawaban:


10

Seperti yang disarankan Ignatio, ini bisa dilakukan dengan grep -v.

Berikut adalah contoh yang menghapus kunci yang berisi some unique stringatau hanya menghapus authorized_keysfile ketika tidak ada kunci lain yang tersisa.

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

Ganti some unique stringdengan sesuatu yang hanya ada di kunci yang ingin Anda hapus.

Sebagai oneliner lebih dari ssh ini menjadi

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'

Diuji pada Linux (SLES) dan HP-UX.


2
lihat jawaban di bawah ini: sedlebih baik dalam melakukan ini
woohoo

25

sed memberikan solusi yang kompak:

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

Ini akan menyimpan aslinya authorized_keysdalam authorized_keys.bak. Jika Anda tidak ingin cadangan kemudian hanya mengubah -i.bakke -i.

Anda bahkan dapat menghapus beberapa kunci:

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

Satu-satunya hal yang sulit di sini adalah karakter khusus di regex yang perlu diloloskan .


Jika Anda hanya menggunakan karakter base64 di file keyfile publik (mis., awk '{print $2}' ~/.ssh/id_rsa.pub), Maka Anda tidak perlu khawatir akan keluar dari karakter khusus apa pun.
Juan

7

Nggak. Anda harus masuk SSH dan menggunakan sedatau grepmenghapus kunci dari file.


Terima kasih. Saya akan membuka pertanyaan sedikit lebih lama untuk melihat apakah seseorang juga dapat memberikan skrip yang berlawanan dengan ssh-copy-id
grm

@ grm: Saya sarankan Anda menjaga pertanyaan tetap terbuka selamanya, atau setidaknya sampai ssh-undo-copy-id diimplementasikan! ;-)
Max L.

0

Phil sudah menjawab pertanyaan ini tetapi saya ingin melakukan penambahan dan membuatnya lebih mudah untuk Anda. Dan karena Anda meminta kebalikan dari ssh-copy-id, saya berasumsi Anda ingin menjalankannya di mesin resmi.

kunci ssh hanya berisi karakter base64 . Jadi Anda bisa menggunakan pembatas sebagai sed yang tidak ada dalam daftar itu. Mari kita gunakan '#'.

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

Ganti hostname dengan IP server.

Opsi PasswordAuthentication akan menyebabkan ssh gagal jika meminta kata sandi


'Komentar' di kunci pub mungkin tidak memiliki karakter base64. Jika memiliki "#", contoh Anda rusak. Mungkin digunakan awk '{print $2}' ~/.ssh/id_rsa.pubdengan beberapa sedatau grep -vsebagai gantinya.
Juan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.