ฉันมีปัญหา. ฉันต้องการ 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 และลายนิ้วมือระยะไกลได้หรือไม่? ขอบคุณล่วงหน้า...
ในกรณีของคุณดูเหมือนว่าคุณมี ecdsa-sha2-p256 ใน known_hosts ดังนั้นคุณอาจต้องการใช้มันเป็นประเภทสำหรับ ssh-keyscan
—
dave_thompson_085
ใช่ฉันรู้ว่าฉันสามารถบังคับประเภทได้ แต่เรามีอุปกรณ์มากมายที่มีหลายประเภทและเราไม่รู้ว่ามีอุปกรณ์ประเภทใด ไม่มีวิธีการอ่านข้อมูลจากเซิร์ฟเวอร์ / known_host ในรูปแบบเดียวกันเพื่อเปรียบเทียบ? หรือวิธีอื่น ๆ อาจเป็นประโยชน์ ..
—
user67714
หากต้องการค้นหาว่ามีคีย์ประเภทใด 'อุปกรณ์' (เซิร์ฟเวอร์) คุณต้องถาม คุณสามารถทำได้
—
dave_thompson_085
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
; นี่เป็นพื้นฐานที่ค่อนข้างสวย
ssh-keyscan
และเนื้อหาของknown_hosts
ไฟล์หลังจากโทเค็นแรกหรือบางครั้งสองเป็น publickey จริงไม่ใช่ลายนิ้วมือ ตราบใดที่คุณไม่ได้ใช้ SSHv1 ที่ใช้งานไม่ได้และล้าสมัยรูปแบบจะเป็นคำที่ให้ประเภทตามด้วย base64 blob เสมอ จำไว้ว่าเซิร์ฟเวอร์ / โฮสต์มักจะมี publickey มากกว่าหนึ่งประเภท หากคุณต้องการssh-keyscan
ได้รับประเภทหรือรายการประเภทเฉพาะ (เช่นสำหรับการเปรียบเทียบ) ให้ใช้-t
ต่อหน้าคน - แต่โปรดทราบว่านี่อาจไม่ใช่ประเภทและคีย์ที่ใช้ในการssh
เชื่อมต่อในภายหลัง