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?

grm
sumber
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.

mleu
sumber
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 .

Phil Frost
sumber
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.

Ignacio Vazquez-Abrams
sumber
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

ibrahim
sumber
'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