ทดสอบว่าลายนิ้วมือ ssh บนเซิร์ฟเวอร์และใน known_hosts ตรงกัน


0

ฉันมีปัญหา. ฉันต้องการ bash script ซึ่งจับคู่ลายนิ้วมือ ssh ใน known_hosts และบนเซิร์ฟเวอร์ระยะไกล นี่คือสิ่งที่ฉันมี:

keyFile=$(mktemp)
ssh-keyscan -H $ip > $keyFile 2> /dev/null
hashRemote=$(ssh-keygen -f $keyFile -H -F $ip | sed -n -r -e 's/^[^#][^ ]+ [^ ]+ ([^ ]+)$/\1/p')
hashLocal=$(ssh-keygen -f ~/.ssh/known_hosts -H -F $ip | sed -n -r -e 's/^[^#][^ ]+ [^ ]+ ([^ ]+)$/\1/p')
rm $keyFile

echo $hashRemote
echo $hashLocal

ปัญหาคือผลลัพธ์ไม่สอดคล้องกัน เนื้อหา od known_hosts ขึ้นอยู่กับประเภทของคีย์ที่รองรับ ดังนั้นผลลัพธ์ของ ssh-keygen จะเป็นดังนี้:

# Host 10.0.0.35 found: line 1 type RSA                                                          
|1|H24d9m0xG5zrw6QBkigVjarwTFw=|xpisuvwhtqsNkH0CJ6pYoB/y1G8= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAB
AQC1Ge/M8bA7nQsbMPy8JmFo6T3Ls2FXR01HyHoW5uwTeW3EoaD39IemRYmkDHLZwlQiLSSrw/kgkHATtQ4pqyg0o5mJoajmw
czUQ78Poavea60OYXJWLh12uZlRjyiu/tQXdHaBI3YwCNnP827t4guvJjpdOAsFgZqfuX9qERGPJMHj0YqRelanB9Za3Fueb9
QsT8wOe/wPCw2YwGapUndcUMoChmN2YRMjRk1JU4DPXiQ56+A2S9V4iP+drZfoK3c3tCdUOVUxCPEwqCraav+viSNq2odVL9F
79jIGxP43TqUcCyMcFU7vGEVshVu7gvUl7KKCMa0wu5pr+Z1X3zUn                                            
# Host 10.0.0.35 found: line 3 type ECDSA                                                        
|1|XdzrIRaJLfushc3efDRkNAJwqcQ=|UUyGx6z6I61mqMVRh/j/5+zs6eA= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNo
YTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLvteJqElWirJtA75IuDtvwKIbGfbvdCE+O/6bkFhj6oFlSVZqqecmm+MzRca
aLg30hLxLpO8bxwVxeVY62sDg8=

ประเภทหนึ่งคือ RSA และประเภทหนึ่งคือ ECDSA คำถามของฉันคือฉันสามารถจับคู่ known_hosts และลายนิ้วมือระยะไกลได้หรือไม่? ขอบคุณล่วงหน้า...


เอาต์พุตจากssh-keyscanและเนื้อหาของknown_hostsไฟล์หลังจากโทเค็นแรกหรือบางครั้งสองเป็น publickey จริงไม่ใช่ลายนิ้วมือ ตราบใดที่คุณไม่ได้ใช้ SSHv1 ที่ใช้งานไม่ได้และล้าสมัยรูปแบบจะเป็นคำที่ให้ประเภทตามด้วย base64 blob เสมอ จำไว้ว่าเซิร์ฟเวอร์ / โฮสต์มักจะมี publickey มากกว่าหนึ่งประเภท หากคุณต้องการssh-keyscanได้รับประเภทหรือรายการประเภทเฉพาะ (เช่นสำหรับการเปรียบเทียบ) ให้ใช้-tต่อหน้าคน - แต่โปรดทราบว่านี่อาจไม่ใช่ประเภทและคีย์ที่ใช้ในการsshเชื่อมต่อในภายหลัง
dave_thompson_085

ในกรณีของคุณดูเหมือนว่าคุณมี ecdsa-sha2-p256 ใน known_hosts ดังนั้นคุณอาจต้องการใช้มันเป็นประเภทสำหรับ ssh-keyscan
dave_thompson_085

ใช่ฉันรู้ว่าฉันสามารถบังคับประเภทได้ แต่เรามีอุปกรณ์มากมายที่มีหลายประเภทและเราไม่รู้ว่ามีอุปกรณ์ประเภทใด ไม่มีวิธีการอ่านข้อมูลจากเซิร์ฟเวอร์ / known_host ในรูปแบบเดียวกันเพื่อเปรียบเทียบ? หรือวิธีอื่น ๆ อาจเป็นประโยชน์ ..
user67714

หากต้องการค้นหาว่ามีคีย์ประเภทใด 'อุปกรณ์' (เซิร์ฟเวอร์) คุณต้องถาม คุณสามารถทำได้ssh-keyscanด้วยการ-tตั้งค่าเป็นประเภทคีย์ทั้งหมดที่รองรับในเวอร์ชันของคุณ (ดูssh -Q keyว่า 6.5 ขึ้นไป) และมันจะแสดงสิ่งที่เซิร์ฟเวอร์มีและไม่สนใจคนอื่น ๆ หากต้องการค้นหาสิ่งที่คุณมีใน hashed known_hosts ให้ค้นหาบรรทัดssh-keygen -F hostที่คุณทำและดูเช่นawk '!/^#/{print $2}'- หรือ$(NF-1)ถ้าคุณต้องการจัดการกับบรรทัดที่มีตัวเลือก หรือsedหรือgrepถ้าคุณมี-Po(PCRE การจับคู่และเอาท์พุทที่เลือก) หรือperlหรือแม้กระทั่งเปลือก builtin read; นี่เป็นพื้นฐานที่ค่อนข้างสวย
dave_thompson_085
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.