เป็นไปได้ไหมที่จะลบคีย์โฮสต์ใดไฟล์หนึ่งจากไฟล์ known_hosts ของ SSH


309

เป็นไปได้ไหมที่จะลบคีย์โฮสต์ใดไฟล์หนึ่งจากไฟล์ known_hosts ของ SSH

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

ฉันเปิดknown_hostsไฟล์ แต่ฉันพยายามเข้าใจเนื้อหาของไฟล์

ด้านล่างเป็นข้อความที่ฉันเผชิญซึ่งทำให้ฉันถามคำถามนี้:

Add correct host key in /home/wissen16/.ssh/known_hosts to get rid of this message.
Offending key in /home/wissen16/.ssh/known_hosts:1
RSA host key for foo.com has changed and you have requested strict checking.
Host key verification failed.

คำตอบ:


514

ใช้คำสั่งนี้เพื่อลบรายการออกจาก known_hosts:

ssh-keygen -R hostname

21
มันทำงานได้กับที่อยู่ IP เช่นกัน ตัวอย่างเช่นฉันมีทางลัดโฮสต์ DNS สำหรับเว็บเซิร์ฟเวอร์ของฉัน ในการลบข้อขัดแย้งที่ฉันมีระหว่างคีย์สำหรับชื่อโฮสต์ที่กำหนดเองและที่อยู่ IP ฉันต้องลบรายการสำหรับทั้งสองดังนั้น ssh-keygen -R xxx.xxx.xxx.xxx
StrangeElement

ดังที่ @StrangeElement พูดว่าบางครั้งเป็นไปได้ที่คุณจะต้องลบโฮสต์ IP ออกจากชื่อโฮสต์
กอนซาโล่เฉา

4
นอกจากนี้มันจะทำการสำรองข้อมูลโดยอัตโนมัติ (บนเครื่อง osx ของฉัน: Original contents retained as /Users/nha/.ssh/known_hosts.oldสมมติว่ามันเหมือนกันสำหรับ Ubuntu)
nha

17
นอกจากนี้หากคุณใช้พอร์ต ssh ที่ไม่ได้มาตรฐานให้ใช้รูปแบบนี้ssh-keygen -R [ssh.sssshh.com]:1234
Shiji.J

คำตอบที่ดีที่สุดสำหรับคำถามนี้ ทำงานเหมือนจับใจ
bademba

32

ใช่คุณสามารถลบคีย์เดียวได้ เพียงเปิดในเครื่องมือแก้ไขและลบบรรทัดที่ละเมิด หมายเลขหลังเครื่องหมายจุดคู่ในข้อความแสดงข้อผิดพลาดคือหมายเลขบรรทัดดังนั้นนั่นคือบรรทัดที่จะลบ - บรรทัดที่ 1 ในตัวอย่างของคุณ ..


1
ฉันไม่รู้ว่ามันระบุหมายเลขบรรทัดซึ่งมีประโยชน์อย่างไม่น่าเชื่อ
deltree

19

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

นอกจากนี้ยังขึ้นอยู่กับข้อผิดพลาดนั้นและโดยที่ไม่รู้ว่าจะเป็นเช่นนั้นอาจเป็นคีย์แรกของไฟล์ที่เป็นปัญหาเพื่อเปิดไฟล์ด้วย vim

vim ~/.ssh/known_hosts

และตี

dd

จากนั้นบันทึก


คุณสามารถใช้: set nu เป็นกลุ่มเพื่อแสดงหมายเลขบรรทัด คำตอบของ Takkat เป็นคำตอบที่ดีที่สุด
Javier Rivera

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

3

การใช้ ssh-keygen -R ชื่อโฮสต์จะไม่ทำงานเสมอไป หากคุณมี SSH เวอร์ชันใหม่ที่ "ซ่อน" ชื่อโฮสต์เพื่อป้องกันการไฮแจ็ก ssh-agent ดูเหมือนว่า ssh-keygen จะไม่สามารถปลดชื่อโฮสต์ได้

ตัวอย่างเช่นฉันมีโฮสต์ชื่อ build-node-01 และฉันได้เชื่อมต่อกับมันและยอมรับคีย์ จากนั้นฉันจะสร้างใหม่ตั้งแต่ต้นรับลายนิ้วมือโฮสต์ใหม่และพยายามเชื่อมต่ออีกครั้งฉันจะได้รับคำเตือนว่ามีข้อขัดแย้งในบรรทัด X (พูด 3) ฉันทำงานssh-keygen -R hostnameแต่ครั้งต่อไปที่ฉันพยายามเชื่อมต่อฉันยังคงได้รับคำเตือนว่ามีข้อขัดแย้ง ฉันตรวจสอบไฟล์เพื่อค้นพบว่าชื่อโฮสต์นั้นถูกแฮชและปรากฏเป็น[1] Bu4Ch@R@4D0M57uFFแทนที่จะเป็นชื่อโฮสต์ที่อ่านได้

ในกรณีนี้วิธีเดียวที่จะกำจัดโฮสต์ที่ถูกลบได้สำเร็จคือการใช้

sed -i 'xd' ~/.ssh/known_hosts

หากต้องการดำเนินขั้นตอนนี้ไปอีกขั้นหนึ่งคุณอาจต้องการสำรองข้อมูลของ known_hosts ในกรณีที่คุณลบบรรทัดที่ไม่ถูกต้องในกรณีนี้ให้เพิ่ม. bak (หรือส่วนขยายใด ๆ ) ลงในตัวเลือก -i เพื่อสร้างการสำรองข้อมูลด้วย ส่วนขยาย. การใช้ ssh-keygen ทำสิ่งนี้โดยอัตโนมัติ

sed -i.bak 'xd' ~/.ssh/known_hosts

5
สิ่งนี้ไม่ถูกต้อง ssh-keygen -R {hostname}จะใช้งานได้แม้ว่าชื่อโฮสต์จะ "ซ่อน" (แฮช) ยังใช่หนึ่งสามารถลบรายการโดยหมายเลข (เช่นรายการที่ 10 ผ่านsed -i.bak 10d ~/.ssh/known_hosts) แต่โดยทั่วไปไม่จำเป็น มันอาจเป็นไปได้ว่าพอร์ตที่ไม่ได้มาตรฐานถูกนำมาใช้ในกรณีที่คุณอาจจะมีการจัดรูปแบบคำสั่งเป็น (คำพูดโน้ต):ssh-keygen -R '[hostname]:2222'
ไมเคิล

ดีใจที่ได้ทราบ @michael_n เป็นไปได้มากว่ามันเป็นพอร์ตที่ไม่ได้มาตรฐานซึ่งส่งผลต่อความสามารถในการลบรายการออก ฉันควรทราบด้วยว่าหากคุณยอมรับลายนิ้วมือหลายตัวสำหรับโฮสต์ฉันไม่แน่ใจว่ามันลบรายการทั้งหมดในครั้งเดียวหรือเพียงครั้งละหนึ่งรายการ
dragon788

1

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

หรือฉันสามารถทำได้ จากที่นี่: วิธีแก้ไขการละเมิดคีย์ในไฟล์ ssh known_hosts

ฉันได้รับ cli เวทมนตร์นี้

sed -i 'xd' ~/.ssh/known_hosts

แทนที่ x ด้วยหมายเลขบรรทัดและ voila นอกจากนี้เขายังเสนอคำตอบ perl ถ้า sed ไม่ทำงาน


0
sed '/10\.20\.120\.211/d' ~/.ssh/known_hosts > temp && mv temp ~/.ssh/known_hosts

ในกรณีนี้ 10.20.120.211 เป็นโฮสต์ที่ฉันต้องการลบจากไฟล์ known_hosts ของฉันตรวจสอบให้แน่ใจว่าคุณได้หลีกเลี่ยงอักขระพิเศษเช่น (.)


ที่อยู่ IP และชื่อโฮสต์จะไม่ถูกจัดเก็บคำต่อคำ (ข้อความที่ชัดเจน) ในไฟล์โฮสต์ที่รู้จักดังนั้นสิ่งนี้จะไม่ทำงาน หนึ่งควรใช้ssh-keygen -R ...(เด่นกว่า); หรือsedด้วยหมายเลขบรรทัดที่ต้องการลบ นอกจากนี้sedในสถานที่ให้ใช้-i' option; e.g., sed -i.bak 10d ~ / .ssh / known_hosts` เพื่อลบบรรทัดที่ 10 และ (เป็นทางเลือก) เก็บต้นฉบับไว้ในไฟล์สำรองที่.bakต่อท้ายด้วย
ไมเคิล

0

คุณสามารถหลีกเลี่ยงการลบโฮสต์โดยเฉพาะการปรับปรุง:

ssh-keyscan -t ecdsa hostname >> ~/.ssh/known_hosts

วิธีนี้คุณไม่ต้องเชื่อมต่ออีกครั้งกับโฮสต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.