कैसे ssh- एजेंट बनाने के लिए स्वचालित रूप से मांग पर कुंजी जोड़ने के लिए?


51

मैं ssh-Agent (अधिकतम जीवनकाल विकल्प के साथ) चलाना चाहता हूं, लेकिन स्टार्टअप पर कोई कुंजी नहीं जोड़ता, बल्कि उन्हें मांग पर जोड़ता हूं।

जैसे मैं पहली बार किसी सर्वर पर लॉगिन करता हूं, उसे अगली बार पासफ़्रेज़ के लिए पूछना चाहिए (जब तक कि मैं एक घंटे से अधिक समय तक प्रतीक्षा नहीं करता) उसे सफाई से कनेक्ट करना चाहिए:

ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...

ssh server2
server2> # no passphrase this time

# wait for lifetime

ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':

मैं हर बार 'ssh-add' चलाने के बारे में मैन्युअल रूप से याद नहीं करना चाहता। (जैसे ssh और "ओह, इसे याद नहीं किया गया है, इसे फिर से लिखना चाहिए" के लिए पासफ़्रेज़ में प्रवेश किया गया है)।

यदि उपयोगकर्ता ने पासफ़्रेज़ प्रदान किया है, तो ssh-agent में कुंजी जोड़ने के लिए ssh को कॉन्फ़िगर कैसे करें?


जवाबों:


58

ssh पहले उपयोग पर एजेंट के लिए एक कुंजी जोड़ने का समर्थन करता है (संस्करण 7.2 के बाद से)। आप निम्नलिखित में डालकर उस सुविधा को सक्षम कर सकते हैं ~/.ssh/config:

AddKeysToAgent yes

यह व्युत्पन्न उपकरणों का उपयोग करते समय भी काम करता है, जैसे गिट।

से 7.2 बदलाव का :

  • ssh (1): एक AddKeysToAgent ग्राहक विकल्प जोड़ें, जो 'हां', 'नहीं', 'पूछ', या 'पुष्टि' के लिए सेट किया जा सकता है, और चूक 'नहीं' में कर सकता है। जब सक्षम किया जाता है, तो प्रमाणीकरण के दौरान उपयोग की जाने वाली एक निजी कुंजी को ssh- एजेंट में जोड़ा जाएगा यदि वह चल रही है (पुष्टि के साथ अगर 'पुष्टि' के लिए सेट है)।

इसके लिए एक ssh- एजेंट को चलना चाहिए। का संदर्भ लें stackoverflow.com/a/24347344/4573065 + एक अच्छा तरीका यह शुरू करने के लिए (केवल एक बार) के लिए अपने टिप्पणी नहीं।
ST-DDT

18

आप धोखा दे सकते हैं और alias ssh='ssh-add -l || ssh-add && ssh'अपने जैसे कुछ डाल सकते हैं .bashrc/ .profile। यह पहला रन ssh-add -l, जो 0 लौटा सकता है (एजेंट पर चाबियाँ हैं), 1 (कोई कुंजी नहीं) या 2 (कोई एजेंट नहीं चल रहा है); यदि यह 0 देता है, sshतो चलेगा; यदि 1 है, ssh-addतो चलेगा और फिर ssh; यदि 2, ssh-addविफल हो sshजाएगा और चलाया नहीं जाएगा। बदलें &&के साथ ;अगर आप चाहते हैं sshतब भी जब कोई एजेंट चल रहा है चलाने के लिए।


3
यह कुंजी को पासफ़्रेज़ का अनुरोध करेगा, तब भी जब ssh कमांड इसका उपयोग नहीं करता है।
वि।

@Vi। सच है, लेकिन दुर्लभ कमांड हैं जो उनका उपयोग नहीं करते हैं (जब तक कि आप कीबोर्ड-इंटरैक्टिव का उपयोग करने वाले सर्वर से कनेक्ट नहीं कर रहे हैं)। जब भी आपको उनकी आवश्यकता होगी, तब चाबी एजेंट में होगी। इसके अलावा, उर्फ ​​सौभाग्य से (या दुर्भाग्य से) ssh के बैकएंड उपयोग को नहीं बदलता है (जैसे git या rsync के साथ)।
जेसिधिया

2
(ssh क्लाइंट के लिए ऑटो-कॉल ssh-add पैच लिखने के बारे में सोच रहा है)
Vi।

इस उत्तर के आधार पर आप विशिष्ट मेजबानों के लिए एक उपनाम बना सकते हैं alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname':। तुम भी अपने सभी ssh कुंजी के लिए एक पाश में डाल सकते हैं और उपनाम उत्पन्न कर सकते हैं। एक गंदा हैक, लेकिन यह काम करता है।
dset0x

5

जब तक ऑटो-कॉल-ssh-add को ssh द्वारा समर्थित नहीं किया जाता है, मैंने .bashrcकोवेन्स्की प्रस्ताव के आधार पर इसे अपने में जोड़ा :

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

पहचान न जोड़े जाने पर ही उपनाम बनाया जाता है, और उपनाम एक बार चलने पर ही नष्ट हो जाता है।

इस तरह से नियमित ssh कमांड का उपयोग पहचान जोड़ने के बाद किया जाता है।


मेरे मामले में काम नहीं करेगा क्योंकि ssh-add के भी टाइमआउट कॉन्फ़िगर किए गए हैं, लेकिन विचार काफी अच्छा है।
वि।

@Vi। समयसीमा इसे कैसे प्रभावित करेगी? यह मेरे लिए बहुत अच्छा काम करता है।
lanrat

1
@lanrat, यह जांचता है कि कुंजी ssh- एजेंट में मौजूद है और उपस्थिति के आधार पर अन्य नाम कॉन्फ़िगर करता है। लेकिन समयबाह्य ( ssh-add -t ...) के कारण ssh- एजेंट में जोड़ी गई कुंजी अचानक दूर जा सकती है, लेकिन उर्फ ​​रुक जाएगा क्योंकि यह कुंजी अभी भी स्मृति में है।
वि।

1

मैं निम्नलिखित शेल फ़ंक्शन का उपयोग कर रहा हूं:

ssh() {
    local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
                           | cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
    for k in $possible_keys; do
        if [[ -f $k ]]; then
            local fingerprint=$(ssh-keygen -lf $k)
            ssh-add -l | grep -q "$fingerprint" || ssh-add $k
        fi
    done
    /usr/bin/env ssh $@
    return $?
}

यह पहले उस होस्ट के लिए कॉन्फ़िगरेशन को हल करता है जिसे मैं कनेक्ट करने का प्रयास कर रहा हूं, फिर उस होस्ट के लिए ssh- एजेंट के लिए संभव कुंजियाँ जोड़ता है यदि वे अभी तक जोड़े नहीं गए हैं और अंत में होस्ट से कनेक्ट होते हैं। मुझे यकीन है कि इसमें सुधार किया जा सकता है, इसलिए मैं प्रतिक्रिया के लिए खुला हूं।

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