วิธีจัดการไฟล์. ssh / known_hosts ของฉัน


47

ฉันใช้เดสก์ท็อป Ubuntu พร้อมเซิร์ฟเวอร์เสมือนจำนวนมากใน Virtual Box เพื่อทดสอบสิ่งของ ฯลฯ ในอดีตฉันยังเชื่อมต่อกับกล่อง VPS Linux ระยะไกลชนิดอื่นด้วย ปัจจุบัน.ssh/known_hostsไฟล์ของฉันมีทั้งพวงกุญแจซึ่งส่วนใหญ่ไม่ได้ใช้งานอีกต่อไป

ฉันต้องการล้าง.ssh/known_hostsไฟล์ของฉันแต่ฉันจะรู้ได้อย่างไรว่าคีย์ใดเป็นของโฮสต์ใด คือฉันจะรู้ได้อย่างไรว่ากุญแจใดที่ฉันสามารถลบได้อย่างปลอดภัยและกุญแจที่ควรทิ้งไว้คนเดียว?

คำตอบ:


64

ในการค้นหาว่ารายการใดมีไว้สำหรับชื่อโฮสต์ที่รู้จักใน known_hosts:

 # ssh-keygen -H  -F <hostname or IP address>

หากต้องการลบรายการเดียวจาก known_hosts:

 # ssh-keygen -R <hostname or IP address>

27

หากคุณมีรายชื่อโฮสต์ทั้งหมดของคุณคุณสามารถทำสิ่งที่ต้องการ

ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts

ซึ่งจะเขียนทับไฟล์. ssh / known_hosts ของคุณด้วยไฟล์ที่สร้างขึ้นใหม่ตามการสแกนโฮสต์

และยังทำในสิ่งที่ผู้อื่นเสนอแนะ HashKnownHosts น่ารำคาญกว่าความช่วยเหลือที่นี่


ssh-keyscanมีกฎการจัดรูปแบบที่เข้มงวดมากของlist_of_hostsไฟล์ มันจะต้องเป็นเพียงที่อยู่และไม่มีช่องว่างอื่น ๆ แล้ว LF หลังจากแต่ละที่อยู่ ซึ่งรวมถึง LF หลังจากที่อยู่สุดท้าย มิฉะนั้นคุณจะได้รับขยะจำนวนมากในไฟล์ที่สร้างขึ้น
Nux

21

ด้วยความยากลำบาก ...

อูบุนตูโดยค่าเริ่มต้นแฮชชื่อโฮสต์ไฟล์ known_hosts (นี่ไม่ใช่พฤติกรรม openssh เริ่มต้น) เพื่อให้ทุกคนที่อ่านไฟล์รู้ว่าระบบที่คุณเข้าถึงนั้นเป็นเรื่องยาก

หากคุณต้องการล้างไฟล์จริงๆตัวเลือกที่ง่ายที่สุดน่าจะเป็นเพียงแค่ลบมันออกและตรวจสอบคีย์สำหรับเซิร์ฟเวอร์ที่คุณรู้ว่ามันเกิดขึ้น แต่จริงๆแล้วฉันเพิ่งจะรู้จัก

คุณสามารถหยุดรายการโฮสต์ใหม่จากการถูกแฮชโดยแสดงความคิดเห็นตัวเลือกใน / etc / ssh / ssh_config

#HashKnownHosts yes

การล้างค่า ~ / .ssh / known_hosts ยังช่วยเมื่อการกำหนดค่าของรีโมตโฮสต์เปลี่ยนไปและ ssh แสดงคำเตือน อย่างไรก็ตามควรระวังสิ่งนั้นและเพิกเฉยคำเตือนสำหรับโฮสต์ที่เชื่อถือได้เท่านั้น
Alex

6
ตัวเลือกที่ดีกว่าอาจจะอธิบายวิธีสร้างแฮชสำหรับชื่อโฮสต์ที่เฉพาะเจาะจงทำให้เขาสามารถค้นหาแฮชนั้นใน known_hosts เพื่อให้เขาสามารถอัปเดตได้
Cerin

1
ssh root@something-new-or-new-dns-aliasหลังจากการเปลี่ยนแปลงข้างต้นเพียงเพิ่มรายการใหม่เช่นโดยการเชื่อมต่อไปยังเซิร์ฟเวอร์ใหม่ด้วย การทำเช่นนี้จะรีเฟรชknown_hostsไฟล์ต้นฉบับและยกเลิกการเข้ารหัสชื่อโฮสต์ / IP
Nux

2

ฉันมีรายการเก่าค้างมากกว่า 300 รายการในไฟล์ known_hosts ของฉัน ไม่แน่ใจว่ามันจะใช้ได้กับทุกระบบ (หรือแม้แต่ระบบส่วนใหญ่) แต่นี่คือสคริปต์ Q & D ของฉัน คุณอาจต้องปรับสตริงหรือตำแหน่งที่ตรงกัน

#!/bin/sh
list=`cat ~/.ssh/known_hosts | awk '{print $1}' |sed -e 's/,/ /g' | sort -u `

listsorted=$(printf "%s\n" ${list[@]} | sort -u)
echo $listsorted
#listsorted="10.2.10.1"
echo > /tmp/sshstat.txt
for host in $listsorted ;
do
echo $host 
ssh -oBatchMode=yes -oConnectTimeout=2  root@${host} "exit" >/tmp/sshstat.txt 2>&1 
ret=$?
if [ $ret -ne 0 ]; then
     echo "Failed: $host"
     echo sed -i.bak \"/$host/d\" "~/.ssh/known_hosts" | sh
else
    grep "Offending RSA" /tmp/sshstat.txt |  sed -e 's/:/ /g' | awk '{printf "sed -i.bak -e \"%dd\" %s  \n", $6, "~/.ssh/known_hosts" }' | sh
   fi
done
#echo $list

สิ่งนี้ใช้ไม่ได้กับknown_hostsไฟล์ที่แฮชและเนื่องจากผู้ถามถามว่า "ฉันจะรู้ได้อย่างไรว่าคีย์ใดเป็นของโฮสต์ใด" ฉันคิดว่าเป็นไปได้มากที่ไฟล์ของเขาจะถูกแฮช เขาบอกว่าเขาอยู่บน Ubuntu และตามที่theotherreceiveกล่าวไว้ Ubuntu โดยปริยาย
Neil Mayhew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.