ज्ञात_होस्ट से कुंजी निकालें


129

मैंने पिछले कुछ हफ्तों के दौरान कई आभासी मशीनों का निर्माण किया। समस्या यह है, .ssh/known_hostsमुझे मध्य चेतावनी में मैन देता है । ऐसा इसलिए होता है क्योंकि वर्चुअल मशीन IP के साथ एक और फिंगरप्रिंट जुड़ा होता है।

में .ssh/known_hostsफ़ाइल, हालांकि, मैं नहीं आईपी से संबंधित रिकॉर्ड, केवल दो विचित्र, कुंजी की तरह तार और "ssh-rsa" मिल रहा है।

क्या किसी के पास पुरानी चाबी को हटाने के बारे में कोई विचार है known_hosts?


7
"विचित्र, कुंजी की तरह के तार" आप हैशेड होस्ट / आईपी पते के लिए संदर्भित करते हैं। यह एक सुरक्षा सुविधा है जो एक घुसपैठिए को यह जानने में मदद करती है कि आपके पास कौन से सिस्टम हैं। यदि आप इसे देखते हैं तो आपका ssh_config HashKnownHosts yesसेट हो गया है।
डेबस्टर

1
यदि आपको लगता है कि फ़ाइल सामग्री बहुत अधिक भ्रामक है, तो संभवतः आपके पास लाइन-रैपिंग सक्रिय है। इसे निष्क्रिय कर दें। सभी लाइनें होस्ट नाम या आईपी पते से शुरू होती हैं।
डैनियल बी

जवाबों:


89
sed -i '6d' ~/.ssh/known_hosts

फ़ाइल को संशोधित करेगा ~ / .ssh / ज्ञात_होस्ट: 6, 6 वीं पंक्ति को हटाते हुए।

मेरी राय में, ssh-keygen -Rओपनश पावर उपयोगकर्ता के लिए उपयोग करना एक बेहतर समाधान है, जबकि आपका नियमित लिनक्स एडमिन उपरोक्त विधियों का उपयोग करके अपने सेड स्किल्स को नया बनाए रखना बेहतर होगा।


18
मुझे नहीं लगता कि यदि आपके पास इसके लिए आधिकारिक आवेदन है, तो मैन्युअल रूप से कॉन्फ़िगरेशन फ़ाइल को संपादित करना एक अच्छी सलाह है। जोखिम लेना आपको एक समर्थक नहीं बनाता है, सबसे तेज और सबसे सुरक्षित विकल्प ढूंढता है। यह लोगों को आगे बढ़ने और /etc/sudoersबिना संपादित करने के लिए कहने जैसा है visudo। यदि आप अपने sedकौशल को तेज करना चाहते हैं , तो आगे बढ़ें और ऐसा करें कि आपके सिस्टम को गड़बड़ाने के बिना।
क्रैक्सर

2
"यदि आपके पास उस के लिए एक आधिकारिक आवेदन है" => दोनों ssh-keygen -Rऔर sed -i {line}dबहुत "आधिकारिक" हैं, और दोनों ही भविष्य के लिए काम करेंगे। Util ssh-keygen लाइन नंबर द्वारा हटाने की अनुमति देता है, दोनों पूरी तरह से स्वीकार्य हैं (क्योंकि, लाइन नंबर अक्सर निपटने के लिए आसान होते हैं, और आधुनिक डेटा सेंटर होस्ट-नामों से निपटने की तुलना में कम त्रुटि वाले होते हैं)।
माइकेल

2
ए) विशेष रूप से 6 वीं पंक्ति का विलोपन, सभी बहुत "देखो कोई हाथ नहीं" है। फ़ाइल की 6 वीं पंक्ति के बारे में क्या महत्वपूर्ण है, इस पर कोई स्पष्टीकरण नहीं है ?! बी) यह भी man ssh-keygenउल्लेख ssh-keygen -R hostname किया है कि आपने अभी तक ssh-keygen -Rकोई होस्टनाम निर्दिष्ट नहीं किया है, और आपने यह नहीं बताया है कि आपका क्या मतलब है।
बार्लोप

123

सबसे सरल उपाय है:

rm -f .ssh/known_hosts

ssh फ़ाइल को फिर से बनाएगा, लेकिन आप अन्य मेजबानों के लिए महत्वपूर्ण जाँच खो देंगे!

या, आप उपयोग कर सकते हैं:

ssh-keygen -R "hostname"

या ssh "मैन-इन-द-बीच" संदेश को संकेत करना चाहिए कि ज्ञात_होस्ट फ़ाइल की किस पंक्ति में अपमानजनक फिंगरप्रिंट है। फ़ाइल को संपादित करें, उस लाइन पर जाएं और इसे हटा दें।


55
ssh-keygen -R hostnameकाम भी करेगा।
ग्रैविटी

6
यदि हम उस फ़ाइल को हटा देते हैं, तो अन्य कुंजियाँ भी हटा देंगी।
shgnInc

16
फ़ाइल को हटाना एक बुरी सलाह है, यह किसी को एक नया पीसी खरीदने के लिए कहने जैसा है क्योंकि पुराने में एक टूटी हुई माउस है। एक फ़ाइल को मैन्युअल रूप से संपादित करना जो एक आधिकारिक एप्लिकेशन द्वारा संपादित किया जा सकता है, एक बुरा विचार भी है। ssh-keygenविकल्प एक टिप्पणी की वजह से जोड़ा गया, लेकिन कोई स्पष्टीकरण के साथ। मुझे नहीं लगता कि यह उत्तर इतने सारे उत्थान का हकदार है।
क्रैक्सर

12
-1 की वजह से "पहली बार संपूर्ण ज्ञात_होस्ट फ़ाइल हटाएं"। यह प्रस्ताव करने के लिए एक भयानक, भयानक, भयानक बात है और इसे संपादित किया जाना चाहिए।
ओलिवियर दुलक

4
यह समाधान ओवरकिल है। बस आपत्तिजनक लाइन हटा दें। बस।
ब्लेक फ्रेडरिक

78

इसके लिए ssh-keygen स्विच ( -R) है।

man ssh-keygen पढ़ता है:

-R होस्ट नाम

hostnameकिसी known_hostsफ़ाइल से संबंधित सभी कुंजियों को निकालता है । यह विकल्प हैशेड होस्ट को हटाने के लिए उपयोगी है ( -Hऊपर विकल्प देखें )।


8
यह सबसे आसान और सबसे सुरक्षित तरीका है।
चिकन

नोट: यह ज्ञात_हॉट्स फ़ाइल की अनुमतियों को 0600 में बदल देगा। यदि आपके पास किसी भी कारण से साझा ज्ञात_होस्ट फ़ाइल है, तो यह इसके साझाकरण को अक्षम कर सकता है।
जिरी क्लौडा

और सही है। इसके अलावा, मुझे करना था [localhost]:port, कोष्ठक का उपयोग करते हुए क्योंकि मैंने एक कस्टम पोर्ट का उपयोग किया है जो मुझे लगता है कि = / है। जैसा कि अन्य लोगों ने कहा है, मैं अपने क्षणिक / परीक्षण प्रणाली विकास के लिए नो एसएसएच की-चेकिंग दृष्टिकोण का भी उपयोग करूंगा।
12

18

चेतावनी आपको ज्ञात होस्ट फ़ाइल में सटीक रेखा बताएगी।

यहाँ एक उदाहरण है:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

/home/user/.ssh/known_hosts:6भाग देखें ? यह फ़ाइल और लाइन नंबर निर्दिष्ट करता है।


10

इस समस्या से छुटकारा पाने के लिए आपको निम्न कमांड चलाने की आवश्यकता है। टर्मिनल खोलें और निम्न कमांड टाइप करें:

नीचे दिए गए सभी उदाहरणों के लिए -R के बाद मान बदलें

ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com

यह विधि पिछले उत्तरों में पहले ही सुझाई जा चुकी है। क्या आप इस बात पर विस्तार कर सकते हैं कि आपके उत्तर में क्या अलग है?
बरगी

@ बरगी - यह ssh-keygen -Rउत्तर अब तक के किसी भी अन्य उत्तर के सिंटैक्स के बारे में अधिक विवरण देता है । यह उदाहरण से पता चलता है कि आप वास्तव में क्या लिख ​​सकते हैं -R। तो यह उत्तर सार्थक है, भले ही यह बिल्कुल नया उत्तर न हो।
यित्ज़

@Yitz मेरी टिप्पणी समीक्षा के हिस्से के रूप में की गई थी। उस समय (18 महीने पहले) मुझे लगा कि सवाल को थोड़ा और बेहतर बनाने के लिए थोड़ी मदद की जरूरत है।
बरगी

8

आप UserKnownHostsFile और StrictHostKeyChecking झंडे का उपयोग करके ज्ञात_होस्ट फ़ाइल की जाँच नहीं करने के लिए ssh को भी निर्देश दे सकते हैं।

उदाहरण के लिए:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

उपयोग में आसानी के लिए आप इसे उपनाम दे सकते हैं:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

अब आप बस सुनार कर सकते हैं जब भी आप सुनिश्चित हों कि आपको सर्वर के प्रमाणपत्र पर भरोसा है।


8
कितना भयानक विचार है। स्थायी रूप से सुरक्षा की एक परत को केवल इसलिए निष्क्रिय कर दें क्योंकि आप अपनी ~/.ssh/known_hostsअप-टू-डेट रखते हुए बहुत आलसी हैं ? सिर्फ आगे जाकर उपयोग क्यों नहीं किया जाता telnet? "जब भी आप निश्चित होते हैं" - यदि आप कभी निश्चित होते हैं, तो आपको पता नहीं होता है कि MITM हमला क्या है और आपको शायद कुछ अच्छा साहित्य पढ़ने में कुछ समय बिताना चाहिए।
क्रैक्सर

2
ओपी के सवाल के आधार पर मुझे लगता है कि यह एक वैध जवाब है। कभी-कभी आपके पास एक परीक्षण प्रणाली होती है जिसे आप बहुत सारे वीएम पर बना / नष्ट कर रहे हैं। (मैं अभी आरएचसीई परीक्षा के लिए प्रस्तुत करने के रूप में यह कर रहा हूं।) कोई सुरक्षा निहितार्थ नहीं हो सकता है। सुरक्षा निहितार्थ पर ध्यान न देने के कारण, मुझे नहीं लगता कि इसे "भयानक विचार" करार दिया जाना चाहिए।
रिक चैथम

संबं धत त य
michael

3

सभी उत्तर अच्छे हैं, लेकिन असली SSH समर्थक के लिए हमें जानकारी गायब है कि पोर्ट नंबर के साथ ssh हस्ताक्षर कैसे निकालें।

  • सरल SSH होस्ट हस्ताक्षर हटाएं आदेश:

    ssh-keygen -R example.com
    
  • जटिल ssh कुंजी निकालें, जैसे कि आप गैर मानक बंदरगाह 222 पर ssh से जुड़ते हैं:

    ssh example.com -p 222
    

और आपको चेतावनी मिलती है, और इसे दूर करने के लिए, आपको वर्ग कोष्ठक का उपयोग करना होगा पोर्ट नंबर:

    ssh-keygen -R [example.com]:222

आशा है कि यह गैर-मानक कॉन्फ़िगरेशन उपयोगकर्ताओं के लिए मदद करता है।


बिल्कुल वही, जिसकी मुझे तलाश है। धन्यवाद!
एसेक्स

1

यहाँ पूर्व संपादक का उपयोग कर एक विधि है:

ex +6d -scwq ~/.ssh/known_hosts

जहां 6 वा चेतावनी संदेश में आपका लाइन नंबर उल्लिखित है। जैसे कि यह एक:

/Home/user/.ssh/ogn_hosts:6 <== LINE NUMBER में IP के लिए महत्वपूर्ण कुंजी


सामान्य तौर पर, इसका इस्तेमाल करने की सलाह दी हैex करने के लिए फ़ाइलों को संपादित गैर सहभागी , के बजाय sedजो और अधिक एक है, एस tream प्रवर्तन निदेशालय itor और उसके -iपैरामीटर जो एक गैर मानक FreeBSD विस्तार है।


0

होस्ट नाम या आईपी के लिए प्रविष्टि पहले कॉलम में होनी चाहिए। चेतावनी में एक पंक्ति संख्या भी होनी चाहिए जहां अपमानजनक कुंजी निहित है।


0

आप rmognhost 111 (111 को हटाने के लिए लाइन है) जैसे ज्ञात मेजबानों से एक भी लाइन हटा सकते हैं :

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

इसे rmknownhostअपने से एक फ़ोल्डर में सहेजें PATH


किसी भी दिए गए टेक्स्ट एडिटर में इसे करने से क्या फायदा है? क्या ऐसा करने का कोई कारण नहीं है, जैसे कि सुडोल को विज़ुदो के साथ कैसे संपादित करना है?
एंडी लेस्टर

इसके साथ क्या विकृतियां आती हैं? उबंटू के पास नहीं है।
flickerfly

लाभ यह है कि यह स्वचालित और त्वरित है / यह एक अलग बाइनरी है जिसे आप स्वयं जोड़ते हैं
grosser

2
जिस दिन आपने यह उत्तर पोस्ट किया था, उसी दिन आपने अपने ब्लॉग प्रविष्टि को लिंक करने के बजाय अपनी स्क्रिप्ट यहाँ पोस्ट की हो सकती है। यह स्पैम IMHO के रूप में योग्य है। यह उल्लेख नहीं करने के लिए कि आप एक ही परिणाम प्राप्त करने के लिए एक सरल उपनाम बना सकते हैं, 7 लाइनों लंबी रूबी स्क्रिप्ट की कोई आवश्यकता नहीं है।
क्रैक्सर

1
या बस इसे अपने ~ / .bashrc में जोड़ें: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }और इसे कॉल करें sshdel [line number]। कोई रूबी, कोई बाइनरी, कोई चिंता नहीं।
रुबिनोरेल्स

0

यह एक टेक्स्ट फाइल है। आप आसानी से vi (m) के साथ संपादित कर सकते हैं और बस प्रश्न (dd) में लाइन हटा सकते हैं, और फ़ाइल (wq) को बचा सकते हैं। लेकिन अगर एक मेजबान को हटाने के लिए एक विशिष्ट आदेश है, तो यह संभवतः सबसे सुरक्षित तरीका है।


मैं यह नहीं देखता कि VIM में फ़ाइल को सीधे कैसे संपादित किया जाए "असुरक्षित"। यह VIM के साथ आपके कम्फर्ट लेवल पर आधारित है। विशेष रूप से इस फ़ाइल के साथ, आपके पास सबसे बड़ा जोखिम बहुत अधिक चाबियाँ हटा रहा है, जिस स्थिति में आपको बस फिर से संकेत मिलेगा।
रिक चाथम

मैं जिस "सुरक्षा" का जिक्र कर रहा था, उसमें 1) अन्य फाइलों में आश्रित जानकारी (यदि कोई हो) और 2 को भूल जाना / न जानना, गलती से जरूरत से ज्यादा या कम हटाना इस प्रकार फाइल को तोड़ना है।
रयान ग्रिग्स ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.