सर्वर पर एक ssh अधिकृत कुंजी को हटाने की आज्ञा


30

क्या सर्वर पर ssh की को हटाने के लिए कमांड (या वन-लाइनर) है? शश-प्रति-आईडी के विपरीत कुछ?


2
कुछ SSH सर्वर सॉफ़्टवेयर अधिकृत SSH कुंजियों के प्रबंधन के लिए RFC 4819 प्रोटोकॉल का समर्थन करते हैं, लेकिन यह लिनक्स पर लगभग दुर्लभ है :(
विशालता

3
उत्कृष्ट प्रश्न, यह कुंजी रोटेशन की सुविधा के लिए ssh-copy-id के लिए वास्तव में लापता कार्यक्षमता है।
ज़बज़्ज़मैन

1
यह ध्यान देने योग्य है कि कुंजी को हटाने के लिए विकल्प ssh-keygenप्रदान करता-R है known_hosts, लेकिन दुख की ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysबात नहीं है। मैं sedइसके बजाय नीचे दिए गए विकल्प का उपयोग करूंगा ।
डिजिटल ट्रॉमा

जवाबों:


10

जैसा कि इग्नेशियो ने सुझाव दिया है कि यह किया जा सकता है grep -v

यहां एक उदाहरण दिया गया है जो कुंजी को some unique stringहटाता है या authorized_keysकोई अन्य कुंजी नहीं रहने पर फ़ाइल को हटा देता है।

if test -f $HOME/.ssh/authorized_keys; then
  if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then
    cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  else
    rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  fi;
fi

some unique stringउस चीज़ से प्रतिस्थापित करें जो केवल उस कुंजी में मौजूद है जिसे आप निकालना चाहते हैं।

Ssh पर एक oneliner के रूप में यह बन जाता है

ssh hostname 'if test -f $HOME/.ssh/authorized_keys; then if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; else rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; fi; fi'

लिनक्स (SLES) और HP-UX पर परीक्षण किया गया।


2
नीचे देखें उत्तर: sedऐसा करने में बेहतर है
वू जूल

25

sed एक कॉम्पैक्ट समाधान प्रदान करता है:

sed -i.bak '/REGEX_MATCHING_KEY/d' ~/.ssh/authorized_keys

इससे मूल authorized_keysमें बचत होगी authorized_keys.bak। यदि आप बैकअप नहीं चाहते हैं तो बस बदल -i.bakदें -i

तुम भी कई चाबियाँ निकाल सकते हैं:

sed -i.bak '/REGEX1/d; /REGEX2/d' ~/.ssh/authorized_keys

यहाँ केवल मुश्किल सा है regex में विशेष अक्षर बच निकलने की जरूरत है


यदि आप सार्वजनिक कीफ़ाइल (उदा। awk '{print $2}' ~/.ssh/id_rsa.pub) में केवल बेस 64 अक्षरों का उपयोग करते हैं , तो आपको किसी विशेष वर्ण से बचने के बारे में चिंता करने की आवश्यकता नहीं है।
जुआन

7

नहीं। आपको SSH की आवश्यकता होगी और फ़ाइल से कुंजी को हटाने sedया उपयोग grepकरने के लिए।


धन्यवाद। मैं प्रश्न को थोड़ी देर खुला
रखूंगा

@grm: मेरा सुझाव है कि आप प्रश्न को हमेशा के लिए खुला रखें, या कम से कम जब तक ssh-undo-copy-id लागू न हो जाए! ;-)
मैक्स एल।

0

फिल ने पहले ही इस सवाल का जवाब दिया लेकिन मैं इसके अलावा करना चाहता हूं और आपके लिए इसे आसान बनाना चाहता हूं। और जब से आप ssh-copy-id से उल्टा पूछ रहे हैं, मैं मान रहा हूं कि आप इसे अधिकृत मशीन पर चलाना चाहते हैं।

ssh कीज़ में केवल बेस 64 अक्षर होते हैं। इसलिए आप एक सीम को सीम सीमांकक के रूप में उपयोग कर सकते हैं जो उस सूची में नहीं है। आइए हम '#' का उपयोग करें।

ssh root@<hostname> -o PasswordAuthentication=no "sed -i.bak 's#`cat ~/.ssh/id_rsa.pub`##' ~/.ssh/authorized_keys"

होस्टनाम को सर्वर आईपी से बदलें।

यदि पासवर्ड पूछते हैं तो PasswordAuthentication विकल्प ssh विफल हो जाएगा


पब कुंजी में 'टिप्पणी' में base64 अक्षर नहीं हो सकते हैं। यदि इसमें "#" है, तो आपका उदाहरण टूट जाता है। शायद awk '{print $2}' ~/.ssh/id_rsa.pubकुछ के साथ sedया grep -vइसके बजाय का उपयोग करें ।
जुआन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.