अगर पहले से ही वहाँ है तो ssh-add शांत रहें


16

मैं ssh-add /path/to/special_keyएक स्क्रिप्ट के शीर्ष पर रखना चाहता हूं । यह ठीक काम करता है, लेकिन यह हमेशा पासफ़्रेज़ के लिए संकेत देता है। यह अजीब है, और थोड़ा कष्टप्रद है, क्योंकि यह अभी भी पासफ़्रेज़ के लिए पूछता हैssh-add -l पता चलता है कि कुंजी पहले ही जोड़ दी गई है।

क्या यह बताने का कोई तरीका है: "इस कुंजी को जोड़ें और पासफ़्रेज़ से पूछें कि क्या पहले से नहीं जोड़ा गया है, अन्यथा कुछ भी नहीं"?


जवाबों:


20

मुझे ssh-add के लिए कोई विकल्प नहीं दिखता है जो आपके वांछित परिणाम को प्राप्त करने में मदद करता है, लेकिन इसके आसपास काम करना बहुत आसान है, यह देखते हुए कि आप विशेष रूप से एक कुंजी के साथ चिंतित हैं।

सबसे पहले, अपने special_key के लिए फिंगरप्रिंट को पकड़ो:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

मान लें कि यह फिंगरप्रिंट 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25 जैसा दिखता है

फिर, अपनी स्क्रिप्ट के शीर्ष पर, ssh-add -lयह जांचने के लिए उपयोग करें कि क्या यह कुंजी लोड है, इसे जोड़ने के लिए संकेत देने से पहले:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

यदि आप चाहें तो आप इसे एक साथ एक पंक्ति में जोड़ सकते हैं:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key

एक-लाइनर अच्छी तरह से काम कर रहा है, धन्यवाद!
डैरेन कुक

1
मुझे यह सरलीकृत वन-लाइनर थोड़ा अधिक समझदार लगता है, और बेहतर है क्योंकि यह टाल जाता है ssh-keygen(आखिरकार, मैं किसी भी कुंजी को उत्पन्न नहीं करना चाहता), इसके बजाय मुख्य पथ का उपयोग कर:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus

1
ssh-keygenजवाब में एक कुंजी उत्पन्न नहीं होती है - जैसा ssh-add -lकि आपके उदाहरण में वास्तव में कुछ भी नहीं जोड़ता है। झंडे आदेशों के व्यवहार को संशोधित करते हैं इसलिए यह नाम से बिल्कुल मेल नहीं खाता है। ध्यान दें कि ये संस्करण कार्यात्मक रूप से भिन्न हैं - यदि पथ द्वारा जाँच की जाती है और उस पथ पर कुंजी बदलती है, तो आपका संस्करण इसे नहीं उठाएगा। उत्तर में संस्करण मौजूदा कुंजी का पता नहीं लगाएगा, जहां से इसे लोड किया गया था।
रिचल्व

5

केवल उपयोग करने की जाँच करने का कोई सीधा तरीका नहीं है, ssh-addलेकिन आप जाँच करने के लिए ssh-keygenऔर कुछ स्क्रिप्टिंग का उपयोग कर सकते हैं ।

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

ऊपर तब प्रिंट होता yesअगर फ़ाइल द्वारा दर्शाया गया फिंगरप्रिंट /path/to/special_keyमौजूद ssh-add -lआउटपुट में होता।

उदाहरण

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

जहाँ से आउटपुट की सामग्री ssh-keygen -lf /path/to/special_keyइस तरह दिखती है:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

और हम सिर्फ 2 कॉलम का चयन करने के लिए `awk '{प्रिंट $ 2} का उपयोग कर रहे हैं, जिसमें फिंगरप्रिंट शामिल हैं, अर्थात:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

संदर्भ


3

आपके पास ssh-addस्पष्ट रूप से उपयोग करने के लिए विशेष कारण हो सकते हैं , लेकिन यदि आप चाहते हैं कि "मैं अपने पासफ़्रेज़ के लिए प्रेरित होना चाहता हूं तो मैं पहली बार कुंजी का उपयोग करता हूं, लेकिन उसके बाद नहीं," ओपनश का एक सरल समाधान है:

AddKeysToAgent yesअपनी .ssh/configफ़ाइल में रखें ।


धन्यवाद। यह जाहिरा तौर पर ssh 7.2 में जोड़ा गया था (Ubuntu 18 संस्करण 7.6 पर प्रतीत होता है)।
डैरेन कुक

हाँ, "AddKeysToAgent मेरे ओपनश संस्करण द्वारा समर्थित नहीं है" ssh-add का स्पष्ट रूप से उपयोग करने का एक अच्छा कारण है ;-)
Nate

0

ssh-add -K FILEमैक पर मेरे लिए ठीक काम किया।
यह अभी भी "आइडेंटिटी एडेड:" लाइनों को दिखाता है लेकिन पासफ़्रेज़ के लिए नहीं पूछता है।

मैन पेज से:

-K पहचान जोड़ते समय, प्रत्येक पासफ़्रेज़ को उपयोगकर्ता के किचेन में भी संग्रहीत किया जाएगा। -D के साथ पहचान हटाते समय, प्रत्येक पासफ़्रेज़ को इससे हटा दिया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.