คำสั่งเพื่อลบคีย์ที่ได้รับอนุญาต ssh บนเซิร์ฟเวอร์


30

มีคำสั่ง (หรือหนึ่งซับ) เพื่อลบคีย์ ssh บนเซิร์ฟเวอร์หรือไม่? อะไรที่ตรงกันข้ามกับ ssh-copy-id


2
ซอฟต์แวร์เซิร์ฟเวอร์ SSH บางตัวรองรับโปรโตคอล RFC 4819 สำหรับการจัดการคีย์ SSH ที่ได้รับอนุญาต แต่ก็ไม่ค่อยพบว่ามันแทบจะไม่มีอยู่บน Linux :(
grawity

3
คำถามที่ยอดเยี่ยมนี่เป็นฟังก์ชั่นที่ขาดหายไปของ ssh-copy-id
Zabuzzman

1
มันน่าสังเกตว่าssh-keygenมันมี-Rตัวเลือกสำหรับการลบกุญแจออกจากknown_hostsแต่น่าเศร้าที่ใช้ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysไม่ได้ ฉันจะใช้sedตัวเลือกด้านล่างแทน
บาดเจ็บทางดิจิทัล

คำตอบ:


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 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

บิตหากินเฉพาะที่นี่เป็นอักขระพิเศษในความต้องการ regex ที่จะหลบหนี


หากคุณใช้เฉพาะเบสหลัก 64 ตัวในพับลิกคีย์ไฟล์ (เช่นawk '{print $2}' ~/.ssh/id_rsa.pub) คุณไม่จำเป็นต้องกังวลเกี่ยวกับการหลีกเลี่ยงอักขระพิเศษใด ๆ
Juan

7

Nope คุณจะต้องใช้ SSH และใช้sedหรือgrepเพื่อลบคีย์ออกจากไฟล์


ขอขอบคุณ. ฉันจะเปิดคำถามต่อไปอีกสักครู่เพื่อดูว่ามีใครสามารถจัดทำสคริปต์ที่ตรงข้ามกับ ssh-copy-id ได้
ไหม

@grm: ฉันขอแนะนำให้คุณเปิดคำถามตลอดไปหรืออย่างน้อยก็จนกว่าจะใช้ ssh-undo-copy-id! ;-)
Max L.

0

ฟิลตอบคำถามนี้ไปแล้ว แต่ฉันต้องการเพิ่มและทำให้ง่ายขึ้นสำหรับคุณ และเนื่องจากคุณกำลังขอย้อนกลับของ ssh-copy-id ฉันถือว่าคุณต้องการเรียกใช้บนเครื่องที่ได้รับอนุญาต

คีย์ ssh มีอักขระฐาน64เท่านั้น ดังนั้นคุณสามารถใช้ถ่านเป็นตัวคั่น sed ซึ่งไม่อยู่ในรายการนั้น ให้เราใช้ '#'

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

แทนที่ชื่อโฮสต์ด้วย IP ของเซิร์ฟเวอร์

ตัวเลือก PasswordAuthentication จะทำให้ ssh ล้มเหลวถ้าถามรหัสผ่าน


'ความคิดเห็น' ในคีย์ผับอาจไม่มีอักขระฐาน 64 ถ้ามันมี "#" ตัวอย่างของคุณก็จะแตก อาจใช้awk '{print $2}' ~/.ssh/id_rsa.pubกับบางส่วนsedหรือgrep -vแทน
Juan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.