पासवर्ड प्रॉम्प्ट के बिना, मैं स्वचालित रूप से ssh-add कैसे चला सकता हूं?


247

मैं एसएसएच के माध्यम से अपने नेटवर्क (स्थिर ईथरनेट) पर कई कंप्यूटरों के बीच संवाद करना चाहता हूं। यह करने के लिए कि मुझे किसी विशिष्ट मशीन पर लॉग इन करने के लिए हर बार ssh-add चलाने की आवश्यकता है, मैं इसे कैसे कर सकता हूं ताकि यह एक बार सेट हो जाए और यह मुझे हर बार पासफ़्रेज़ के लिए न कहे, जब मैं लॉग इन करता हूं या रिबूट करता हूं मेरी मशीन?

मुझे पता है कि एक तरीका है कि आपको bash_profileफ़ाइल में कुछ लाइनें जोड़नी चाहिए , लेकिन मुझे अभी भी हर बार जब मैं किसी विशेष मशीन में रीबूट / लॉग इन करता हूं, तो मुझे पासवर्ड टाइप करना होगा।

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent -s`
    ssh-add
fi

जवाबों:


348

यह सुरक्षा और सुविधा के बीच व्यापार बंद का एक विशिष्ट उदाहरण है। सौभाग्य से कई विकल्प हैं। सबसे उपयुक्त समाधान उपयोग परिदृश्य और वांछित स्तर की सुरक्षा पर निर्भर करता है।

ssh-key with passphrase, नहीं ssh-agent

अब प्रमाणीकरण के लिए कुंजी का उपयोग करने के लिए हर बार पासफ़्रेज़ दर्ज करना होगा। जबकि सुरक्षा दृष्टिकोण से यह सबसे अच्छा विकल्प है, यह सबसे खराब प्रयोज्य प्रदान करता है। यह एक कमजोर पासफ़्रेज़ को बार-बार प्रवेश करने के बोझ को कम करने के लिए चुना जा सकता है।

ssh-key पासफ़्रेज़ के साथ, साथ ssh-agent

निम्नलिखित को जोड़ना ~/.bash_profileस्वचालित रूप से शुरू होगा ssh-agentऔर लॉगिन पर ssh-key (s) लोड करेगा:

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

अब हर लॉगिन पर पासफ़्रेज़ दर्ज किया जाना चाहिए। प्रयोज्यता के दृष्टिकोण से थोड़ा बेहतर है, लेकिन इसमें यह दोष है कि ssh-agentलॉगिन सत्र के दौरान कुंजी का उपयोग किया जाना है या नहीं, इसकी परवाह किए बिना पासफ़्रेज़ के लिए संकेत देता है। प्रत्येक नया लॉगिन एक अलग ssh-agentउदाहरण भी देता है जो लॉगआउट के बाद भी मेमोरी में जोड़े गए कुंजी के साथ चल रहा है, जब तक कि स्पष्ट रूप से मार नहीं दिया जाता है।

ssh_agentलॉगआउट पर मारने के लिए, निम्न को जोड़ें~/.bash_logout

if [ -n "$SSH_AUTH_SOCK" ] ; then
  eval `/usr/bin/ssh-agent -k`
fi

या निम्नलिखित को ~/.bash_profile

trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0

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

डेस्कटॉप पर, डेस्कटॉप वातावरण के साथ शामिल ssh- एजेंट, जैसे गनोम कीरिंग SSH एजेंट , एक बेहतर दृष्टिकोण हो सकता है क्योंकि वे आमतौर पर पासफ़्रेज़ के लिए संकेत देने के लिए बनाए जा सकते हैं जब पहली बार ssh-key का उपयोग लॉगिन सत्र के दौरान किया जाता है और सत्र के अंत तक मेमोरी में डिक्रिप्टेड निजी कुंजी संग्रहीत करें।

ssh-key पासफ़्रेज़ के साथ, साथ ssh-ident

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

सक्षम करने के लिए ssh-ident, इसे स्थापित करें और निम्नलिखित उपनाम को अपने में जोड़ें ~/bash_profile:

alias ssh='/path/to/ssh-ident'

ssh-key पासफ़्रेज़ के साथ, साथ keychain

keychainएक छोटी सी उपयोगिता है जो ssh-agentआपकी ओर से प्रबंधित करती है और ssh-agentलॉगिन सत्र समाप्त होने पर चालू रहने की अनुमति देती है। बाद के लॉगिन पर, keychainमौजूदा ssh-agentउदाहरण से जुड़ेगा। व्यवहार में, इसका मतलब है कि पासफ़्रेज़ को केवल रिबूट के बाद पहले लॉगिन के दौरान दर्ज किया जाना चाहिए। बाद के लॉगिन पर, मौजूदा ssh-agentउदाहरण से अनएन्क्रिप्टेड कुंजी का उपयोग किया जाता है। cronपासवर्डविहीन ssh- कीज़ के बिना नौकरियों में पासवर्ड रहित RSA / DSA प्रमाणीकरण की अनुमति देने के लिए भी यह उपयोगी हो सकता है ।

सक्षम करने के लिए keychain, इसे स्थापित करें और निम्नलिखित में कुछ इस तरह जोड़ें ~/.bash_profile:

eval `keychain --agents ssh --eval id_rsa`

सुरक्षा के दृष्टिकोण से, ssh-identऔर एक विशेष सत्र के जीवनकाल तक सीमित उदाहरणों keychainसे भी बदतर हैं ssh-agent, लेकिन वे उच्च स्तर की सुविधा प्रदान करते हैं। की सुरक्षा में सुधार करने के लिए keychain, कुछ लोग --clearअपने ~/.bash_profileकिचेन इनवोकेशन में विकल्प जोड़ते हैं । इस पासफ्रेज़ को ऊपर के रूप में लॉगिन पर फिर से दर्ज किया जाना चाहिए, लेकिन cronउपयोगकर्ता लॉग आउट होने के बाद भी नौकरियों को अनएन्क्रिप्टेड कुंजी तक पहुंच प्राप्त होगी। keychain विकि पृष्ठ अधिक जानकारी और उदाहरण है।

ssh- कुंजी बिना पासफ़्रेज़ के

सुरक्षा के दृष्टिकोण से, यह सबसे खराब विकल्प है क्योंकि निजी कुंजी पूरी तरह से असुरक्षित है जब यह उजागर होता है। हालांकि, यह सुनिश्चित करने का एकमात्र तरीका है कि रिबूट के बाद पासफ़्रेज़ को फिर से दर्ज करने की आवश्यकता नहीं है।

ssh-key पासफ़्रेज़ के साथ ssh-agent , स्क्रिप्ट से पासफ़्रेज़ पास करने के साथssh-add

जबकि यह ssh-addएक स्क्रिप्ट से पासफ़्रेज़ को पास करने के लिए एक सीधा विचार की तरह लग सकता है , उदाहरण के लिए echo "passphrase\n" | ssh-add, यह उतना कठिन नहीं है जितना कि ऐसा लगता है ssh-add कि पासफ़्रेज़ को नहीं पढ़ा है stdin, लेकिन /dev/ttyसीधे पढ़ने के लिए खुलता है

इसके साथ काम किया जा सकता है expect, इंटरैक्टिव अनुप्रयोगों को स्वचालित करने के लिए एक उपकरण। नीचे एक स्क्रिप्ट का उदाहरण दिया गया है जो स्क्रिप्ट में संग्रहीत पासफ़्रेज़ का उपयोग करके ssh-key जोड़ता है:

#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact

ध्यान दें कि पासफ़्रेज़ को सुरक्षा परिप्रेक्ष्य से स्क्रिप्ट में प्लेनटेक्स्ट में संग्रहीत किया जाता है, यह पासवर्डलेस ssh-key होने से बेहतर है। यदि इस दृष्टिकोण का उपयोग किया जाना है, तो यह सुनिश्चित करना महत्वपूर्ण है कि expectपासफ़्रेज़ वाली स्क्रिप्ट के पास उचित अनुमतियाँ हैं, जो कि मुख्य स्वामी द्वारा केवल पढ़ने योग्य, लिखने योग्य और चलाने योग्य हैं।


1
ठीक है, लेकिन जब मैंने आपका कोड ~ / .bash_profile पर डाल दिया तो मुझे हर बार लॉगिन करते समय पासवर्ड टाइप करना होगा, मुझे वह भी नहीं चाहिए। मुझे सुरक्षा को लेकर बिल्कुल भी चिंता नहीं है। इको "पास \ n" | ssh-add काम नहीं करता है
zdun8

3
@ user1607072 हाँ, यह है कि कैसे ssh-agentस्निपेट ~/.bash_profileउत्तर में बताया गया है। आप keychainउपयोगिता को देखना चाह सकते हैं । साथ keychainआप रिबूट के बाद पहली बार प्रवेश करने पर पासवर्ड डालना होगा, लेकिन बाद में लॉगिन पर keychainएक मौजूदा से कनेक्ट करेगा ssh-agentस्मृति में decrypted कुंजी के साथ उदाहरण। इसके अलावा वहाँ एक पासफ़्रेज़ के बिना एक ssh- कुंजी उत्पन्न करने का विकल्प है, लेकिन यह निश्चित रूप से अनुशंसित नहीं है।
थॉमस निमन

3
@ user1607072 जब मैं अधिक सुरक्षित तरीकों में से एक का सुझाव देता हूं, तो ssh-addस्क्रिप्ट से पासफ़्रेज़ को पास करने का एक तरीका है । echo "pass\n" | ssh-addकाम नहीं करने का कारण यह है कि ssh-addपासवर्ड से नहीं पढ़ा जाता है stdin, लेकिन /dev/ttyसीधे पढ़ने के लिए खुलता है । यूटिलिटी का उपयोग करके, इसके लिए वर्कअराउंड को शामिल करने के उत्तर को अपडेट किया expect
थॉमस निमन

1
@ user1607072 यह आपके उपयोग के मामले के लिए थोड़ा ज्यादा हो सकता है, लेकिन ssh GSSAPI समर्थन के साथ संयोजन में Kerberos का उपयोग पासवर्ड रहित ssh लॉगिन के लिए भी किया जा सकता है। Ssh में संबंधित प्रमाणीकरण विधि को कहा जाता है । यह आमतौर पर बड़े नेटवर्क में उपयोग किया जाता है, लेकिन निश्चित रूप से यदि आप इसमें रुचि रखते हैं तो यह देखने लायक हो सकता है। gssapi-with-mic
थॉमस निमन

1
@ErickBrown: यहाँ पहले से ही उत्तर दिया गया है । SSH एजेंट इकाई को लॉगआउट पर रोक दिया जाना चाहिए, यदि आपके पास उपयोगकर्ता लॉगिन है जो सिस्टम लॉग मैनेजर में अक्षम है । यदि उपयोगकर्ता की भाषा सक्षम की जाती है, तो सिस्टम लॉगिन उपयोगकर्ता और SSH एजेंट इकाई को अंतिम लॉगिन सत्र बंद होने के बाद भी चालू रखा जाता है।
थॉमस निमन

93

इसे अपने में जोड़ें ~/.bashrc, फिर लॉगआउट करें और प्रभावी होने के लिए वापस जाएं।

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

यह केवल एक पासवर्ड के लिए प्रांप्ट करना चाहिए जब आप प्रत्येक रिबूट के बाद लॉगिन करते हैं। यह वही पुन: उपयोग रखेंगे ssh-agentजब तक कि यह चल रहा है रहता है।


1
बहुत साफ-सुथरा, इस तरह से आपके पास केवल एक ही ssh-agent चल रहा है: (जैसे कई एजेंट @ thomasNyman के दूसरे घोल में मुझे सुरक्षा का खतरा लगता है ...
drevicko

1
विभिन्न साइटों में शोध करने और विभिन्न समाधानों को पढ़ने के बाद, यह यहां स्पष्ट रूप से, सीधे बिंदु पर प्रतीत होता है। बहुत अच्छा। +1
डॉ। बीईओ जू

1
ऐसा करने के लिए बेहतर है: `उर्फ ssh = ssh- चेक-एजेंट”, और चेक-एजेंट संस्करण उपरोक्त है। इस तरह से: ए) आपको केवल एक एजेंट मिलता है और बी) आपको केवल एजेंट मिलता है यदि आपको इसकी आवश्यकता है
एरिक एरोनिटी

2
मुझे लगता है कि यह डिफ़ॉल्ट है, इसलिए हम पहले से ही ऐसा कर रहे हैं।
Collin एंडरसन

1
ssh-add -l0 का एक एग्जिट कोड लौटाता है, जब एजेंट की पहचान होती है और 1 जब ऐसा नहीं होता है तो आप अंतिम कमांड से बाहर grep काट सकते हैं और उपयोग कर सकते हैंssh-add -l > '/dev/null' || ssh-add
Humphries

16

ओपी के प्रश्न के साथ निकटता से संबंधित नहीं है, लेकिन यह दूसरों के लिए उपयोगी हो सकता है: चूंकि 7.2.0 ssh (1) में एक विकल्प है जो पहले प्रमाणीकरण पर ssh-agent की कुंजी जोड़ने की अनुमति देता है; विकल्प है AddKeysToAgentऔर सेट किया जा सकता करने के लिए yes, no, ask, या confirm, प्रणाली में या आपकी व्यक्तिगत पर .ssh/configफ़ाइल।

संदर्भ: https://www.openssh.com/txt/release-7.2


2
उन लोगों के लिए जो .ssh/configफ़ाइल में नए हैं : यह लागू होता है sshऔर इसके sshपीछे उपयोग करने वाली कोई भी चीज़ , उदाहरण के लिए scp, और प्रति-होस्ट आधार पर की जा सकती है।
एसईओएफ

जब भी मैं लॉगिन करता हूं, तब भी यह मुझसे पासवर्ड मांगता है और उदाहरण के लिए पुल खींचने की कोशिश करता है।
ट्रिनोनेसिस

@trainosis मुद्दा यह है कि आपके पास संभवतः एक ssh- एजेंट का उदाहरण नहीं है जो कि भविष्य में उपयोग के लिए डिक्रिप्ट की (s) मेमोरी को चलाने के लिए चल रहा है। Ssh- एजेंट का उपयोग करते समय आपको लॉगिन सत्र के अनुसार एक बार दिए गए कुंजी के लिए पासवर्ड दर्ज करना चाहिए।
ईस्त्राद

7

ssh-agent विभिन्न अनलॉक किए गए ssh- कीज़ को कैश करता है, इसलिए आपके पास पासवर्ड द्वारा संरक्षित ssh-keys हो सकती हैं, लेकिन हर बार उन्हें टाइप किए बिना।

अनलॉक की गई चाबियों को कैश करने के लिए, यह स्पष्ट रूप से उन कुंजियों को अनलॉक करने की आवश्यकता है। पासफ़्रेज़ के साथ लॉक की गई कुंजियों को अनलॉक करने के लिए, यह स्पष्ट रूप से इन पासफ़्रेज़ को जानना होगा।

किसी भी विधि को मानव से प्राधिकरण की आवश्यकता नहीं होती है (उदाहरण के लिए "पासवर्ड में टाइप करना") न केवल आपके सिस्टम को असुरक्षित बना देगा; यह ssh- एजेंट के संपूर्ण उद्देश्य को भी व्यर्थ कर देगा।

यह सब कहने के बाद, आप बस ssh- कुंजियों का उपयोग कर सकते हैं जो पासवर्ड से सुरक्षित नहीं हैं ( Enterकुंजी-पीढ़ी के दौरान पासवर्ड के लिए पूछे जाने पर हिट करें )। चूंकि कोई पासवर्ड नहीं है, ssh-agentइसलिए इसे कैश करने के लिए आपको किसी से पूछने की आवश्यकता नहीं है।


मैं सहमत हूं, जब तक आपकी चाबियाँ ठीक से केवल उपयोगकर्ता-अनुमत हैं, तब तक अनुमति-रहित कुंजियों पर ssh-Agent को बहुत कम लाभ है। मैं एक लॉगिन सर्वर में ssh करना पसंद करता हूं, और फिर, उस सर्वर में permssionless कुंजियों का एक गुच्छा होता है, जिनमें से प्रत्येक का उपयोग केवल एक अन्य सर्वर को अनलॉक करने के लिए किया जा सकता है। लॉगिन सर्वर और कुछ नहीं करता है, इसलिए इसे हैक करना / स्पूफ करना बहुत कठिन है, आदि ... अन्य सर्वर में कोई पासवर्ड एक्सेस नहीं है, केवल-कुंजी है।
एरिक क्रोनिटी

5

यहाँ आपके SSH पासफ़्रेज़ को स्वचालित करने के लिए वर्कअराउंड है।

  1. एक-लाइनर स्क्रिप्ट बनाएं जो आपके पासफ़्रेज़ को मानक आउटपुट पर प्रिंट करता है, जैसे:

     echo 'echo MY_SSH_PASSWORD' > ~/.print_ssh_password && chmod 700 ~/.print_ssh_password
    

    महत्वपूर्ण: सुनिश्चित करें कि आप अपने पासवर्ड को अपने इतिहास में संग्रहीत करने से रोकने के लिए अग्रणी स्थान की प्रतिलिपि बनाएँ ।

और नीचे दिए गए तरीकों में से एक का उपयोग करें।

  • एक मानक इनपुट दृष्टिकोण का उपयोग करना:

    cat ~/.ssh/id_rsa | SSH_ASKPASS=~/.print_ssh_password ssh-add -
    
  • या नामित पाइप दृष्टिकोण:

    1. एक नामित पाइप बनाएं (आप एक प्रक्रिया प्रतिस्थापन की कोशिश भी कर सकते हैं ):

      mkfifo --mode 0600 ~/.ssh_fifo
      
    2. ssh-addप्रमाणीकरण के लिए उपयोग किए जाने वाले कार्यक्रम को निर्दिष्ट करके चलाएँ :

      cat ~/.ssh/id_rsa >~/.ssh_fifo | SSH_ASKPASS=~/.print_ssh_password ssh-add ~/.ssh_fifo
      

    देखें: के man ssh-addबारे में अधिक पढ़ने के लिए SSH_ASKPASS


2
echo my_passphraseएक बड़ी सुरक्षा छेद है। आपके द्वारा टाइप करने के बाद सबसे पहले, पासवर्ड आपके द्वारा उपयोग किए गए शेल के इतिहास फ़ाइल में स्पष्ट पाठ में है। और दूसरी कमांड लाइन तर्क यूनिक्स ( ps -ef) पर पढ़ने योग्य हैं । कमांड लाइन के तर्कों में कभी भी पासवर्ड न डालें!
ceving

1
@ एसेसिंग अतिरिक्त अग्रणी स्थान को इतिहास फ़ाइल के साथ समस्या हल करती है। अतिरिक्त जानकारी जोड़ी।
kenorb

@kenorb: यह psआउटपुट में दिखाई देने वाले पासवर्ड की बड़ी समस्या को हल नहीं करता है । इतिहास फ़ाइल आम तौर पर वैसे भी केवल मालिक द्वारा पठनीय होती है, लेकिन कमांड लाइन एक सिस्टम पर सभी उपयोगकर्ताओं द्वारा पठनीय होती है।
थॉमस निमन

4

मैं आपको ssh-add (जो ssh-agent खोलने की आवश्यकता है) को लॉगिन करने की सलाह नहीं दूंगा। यह इसलिए है क्योंकि ssh- एजेंट अनुभाग समाप्त होने पर आप नियंत्रित नहीं कर सकते हैं, और सुरक्षा जोखिम पैदा कर सकते हैं जब आपको अपने लॉगिन अनुभाग में कीफ़ाइल्स का उपयोग करने की आवश्यकता नहीं होती है।

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

आपके पास दो विकल्प होंगे:

  1. अपनी कुंजी के लिए सभी पासफ़्रेज़ निकालें, जिनकी सुरक्षा कमजोर होती है यदि आपकी कुंजी फ़ाइलें चोरी हो जाती हैं। (इस प्रकार अनुशंसित नहीं )

  2. अपनी कुंजी के लिए उसी पासफ़्रेज़ का उपयोग करें। तब जब आप ssh-add keyfile1 keyfile2 ..., आपको केवल प्रति सेक्शन एक बार पासफ़्रेज़ लिखना होगा।

दोनों मामलों में, आप ऐसी स्क्रिप्ट फ़ाइल "ssh_keys_section.sh" नीचे लिख सकते हैं:

#!/bin/bash
# This script run a ssh-agent on a sub-shell and automatically ssh-add all keyfiles at once.
# This agent ends when you type `exit` to close the sub-shell.
exec ssh-agent bash -c "ssh-add /path/to/keyfile1 /path/to/keyfile2 ...; exec bash"

टिप्पणियों:

  • पासफ़्रेज़ को बदलने या हटाने का आदेश: ssh-keygen -p -f keyfile
  • उप-शेल के भीतर, आप और भी टर्मिनलों को कांटा सकते हैं जो समान अनलॉक की गई कुंजियों को साझा करते हैं, हो सकता है कि जैसे एक कमांड का उपयोग करके /path/to/yourterminal &(निर्भर करें पृष्ठ)

जैसे सिग्विन के भीतर विंडोज पर, /path/to/yourterminal &==>mintty &
जॉनी वोंग

2
if [ ! -S ${HOME}/.ssh/ssh_auth_sock ]; then
  eval $(ssh-agent)
  ln -sf "${SSH_AUTH_SOCK}" ${HOME}/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=${HOME}/.ssh/ssh_auth_sock

ssh_keys=$(find -E ~/.ssh -type f -regex '.*(rsa$|pem)')
ssh_agent_keys=$(ssh-add -l | awk '{key=NF-1; print $key}')

for k in "${ssh_keys}"; do
    for l in "${ssh_agent_keys}"; do
        if [[ ! "${k}" = "${l}" ]]; then
            ssh-add "${k}" > /dev/null 2>&1
        fi
    done
done

2

मैं स्टीमपॉवर द्वारा उल्लिखित स्क्रिप्ट का उपयोग करता था, मैंने नीचे अब एक बना दिया है, क्योंकि यह आसपास पड़ी फ़ाइलों को नहीं छोड़ता है।

zshकेवल शेल पर काम करना ।

#!/bin/sh

AGENT_BIN=`which ssh-agent`
AGENT_ADD_BIN=`which ssh-add`
AGENT_PID=`ps -fe | grep ${AGENT_BIN} | awk -vuser=$USER -vcmd="$AGENT_BIN" '$1==user && $8==cmd{print $2;exit;}'`
if [ -z "$AGENT_BIN" ]; then
    echo "no ssh agent found!";
    return
fi
if [ "" -eq "$AGENT_PID" ]; then
    if read -sq "YN?Do you want to unlock your ssh keys?"; then
        echo ""
        output=`$AGENT_BIN | sed 's/echo/#echo/g'`
        eval $output
        $AGENT_ADD_BIN
    fi
else
    for f in "/proc/"*
    do
        cmdline=`cat "$f/cmdline"`
        if [ "${AGENT_BIN}" -ef "${cmdline}" ]; then
            export SSH_AUTH_SOCK=`cat $f/net/unix | grep --binary-file=text -oP '((/[^/]*?)+/ssh-[^/]+/agent\.\d+$)'`
            export SSH_AGENT_PID=${f##*/}
            break;
        fi
    done
fi

1
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
     echo succeeded
     chmod 600 "${SSH_ENV}"
     . "${SSH_ENV}" > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

यहाँ श्रेय देना: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html

यह समाधान यहां भी समर्थित है: http://mah.everybody.org/docs/ssh


1

SSH के लिए समाधान पर एकल संकेत मुझे ले जा सकता है pam_ssh

इस लेख के अनुसार , अवधारणा है:

यदि आप ssh के माध्यम से कई * nix- आधारित मशीनों के साथ काम करते हैं, तो आप शायद हर बार अपना पासवर्ड दर्ज करने के लिए लगातार थक जाते हैं जब आप किसी अन्य बॉक्स का उपयोग करना चाहते हैं। आपको प्रत्येक मशीन तक पहुँचने की अनुमति देने का एक सुरक्षित तरीका है, जिसे आपने किसी अन्य पासवर्ड (मूल रूप से आपके द्वारा हस्ताक्षरित एक के अलावा अन्य) में प्रवेश किए बिना उपयोग किया है।


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

मैंने यह सत्यापित नहीं किया है कि यह वास्तव में काम करेगा।


0

इसे अपनी ~/.bashrcफ़ाइल में जोड़ें :

ssh-add -L|grep identities > /dev/null && ssh-add /path/to/ssh/private/key

मैं यह नहीं देखता कि यह सवाल किस तरह से संबंधित है, जो बाद के लॉगिन पर पासवर्ड के लिए प्रेरित नहीं किया जा रहा है।
क्रिस डाउन

0

एक (संभवतः पासवर्ड रहित) कुंजी जोड़ने और यह सुनिश्चित करने के लिए कि ssh-addकिसी पासवर्ड के लिए संकेत नहीं दिया जाएगा, कोई बात नहीं, यहां तक ​​कि जब एक्स के नीचे चल रहा हो :

DISPLAY= ssh-add -k /path/to/key </dev/null &>/dev/null

बाहर निकलने की स्थिति सफलता या विफलता का संकेत देती है।


0

यदि आप अपने पासवर्ड मैनेजर के रूप में सीहोर चला रहे हैं ... जो आप शायद हैं; डी

एक और समाधान जो आप के लिए देख रहे लक्ष्य को प्राप्त करता है, बस लॉगिन पर स्वचालित अनलॉक के लिए सीएचआर कुंजी को सीहोर में जोड़ना है। इसका प्रमुख लाभ यह है कि आपको कभी भी gdm के माध्यम से लॉगिन करने के बाद, या यदि आपके पास जो भी पासवर्ड होता है, उसके साथ लॉगिन करने पर आपको कुंजी के लिए एक पासवर्ड दर्ज करने की आवश्यकता नहीं है। यह निजी कुंजी और सार्वजनिक कुंजी दोनों की आवश्यकता है। वे सीहोर के लिए एक नामकरण सम्मेलन का भी पालन करते हैं। डिफ़ॉल्ट स्वीकार्य है (निजी कुंजी के लिए id_rsa और सार्वजनिक कुंजी के लिए id_rsa.pub ... वास्तव में निजीकरण और Privatekeyname.pub कुछ भी है )

लॉगिन पर स्वचालित अनलॉक के लिए आपको सीहोर की ssh कुंजी जोड़ने के लिए; (Fedora25 पर, मुझे यकीन नहीं है कि रास्ता अन्य डिस्ट्रोस पर कहाँ है, हालांकि इसकी सबसे अधिक संभावना है)

/lib64/seahorse/seahorse-ssh-askpass /path/to/keys/here

मेरे लिए, यह था

/lib64/seahorse/seahorse-ssh-askpass ~/.ssh/id_rsa

(सीहोरस स्वचालित रूप से मान लेंगे कि मेरे मामले में सार्वजनिक कुंजी id_rsa.pub थी)

कमांड निष्पादित करने के बाद, सीहोर निजी कुंजी के लिए पासवर्ड दर्ज करने के लिए एक प्यारा सा gtk पासवर्ड फ़ील्ड खोलेगा। या इसे खाली छोड़ दें यदि आपने पासवर्ड के बिना कुंजी उत्पन्न की है।

अगर सब कुछ ठीक हुआ तो सीहोर आपको संकेत नहीं देगा। आपको लक्ष्य मशीन में ssh करने का प्रयास करना होगा। तब सीहोरसे आपको कुंजी को पासवर्ड के साथ कुंजी को अनलॉक करने के लिए संकेत देगा (THIS WILL ONLY HAPPEN ONCE) फिर से, लेकिन इस बार थोड़ा अलग दिखना चाहिए; पी (यह भी वह हिस्सा है जहां सीहोर कुछ सीहोर को ssh-add मैजिक के लिए मानता है, मेरा मानना ​​है कि ), और लॉगिन पर कुंजी को अनलॉक करने के लिए विकल्प की पेशकश करें , आपको अपने लक्ष्य को प्राप्त करने के लिए इस विकल्प की जांच करनी चाहिए।

सिर्फ इसलिए कि मैंने सभी उत्तर नहीं पढ़े हैं, मैं इस उत्तर का प्रयास करने से पहले आपको बताऊंगा कि सभी ने आपको ssh-add के साथ क्या करना है। अन्यथा ऐसा करने से आपकी चाबियों में कुछ खराब हो सकता है।


0

यहाँ निश्चित लिपि है।

$ PASSW को अपडेट करें, फिर अपने टर्मिनल में कॉपी-पेस्ट करें

# <sshpass> via typinator
# Updated: 2017-01-18_21h36
#
# apt-get update -y; apt-get install expect -qy

# Pass this value to ssh-add
PASSW="myfancypass123"

# Define a name for this script
THIS_SCRIPT="$(date +%Y-%m-%d_%H-%M-%S-%N)".sh

# Create a fresh directory to work from / Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la


# Output our bash script file - BEGIN
cat <<< '
#!/bin/bash

set -u     # Stop if an unbound variable is referenced
set -e     # Stop on first error
export HISTIGNORE="expect*";

# Normal CMDs
echo && echo "The process should take about 10 seconds:" && echo
eval "$(ssh-agent -s)"; sleep 0.5;

# Define VAR passed when this bash-script was launched
password="$@"

# Launch the expect magic
expect -c "
    spawn ssh-add /root/.ssh/id_rsa
    expect "?assword:"
    send \"$password\r\"
    expect "?password:"
    send \"$password\r\"
    expect eof"

export HISTIGNORE="";
export password="";
' > $THIS_SCRIPT
# Output our bash script file - END


# Ensure we are in the right path
cd ~/temp; ls -la; sleep 1;

# Run the bash script
chmod +x ./$THIS_SCRIPT; ./$THIS_SCRIPT "$PASSW"; unset password;

# Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la

0

सबसे अच्छा तरीका मुझे पता है कि मैं एक PAM लॉगिन स्क्रिप्ट का उपयोग करता हूं जिसे मैंने पिछले काम से अनुकूलित किया था क्योंकि मुझे इस प्रश्न में संतोषजनक उत्तर नहीं मिला।

आपका पासफ़्रेज़ आपके सिस्टम पासवर्ड और एक भारी व्युत्पत्ति फ़ंक्शन के साथ एन्क्रिप्टेड संग्रहीत हो जाता है। लॉगिन पर, आपके सिस्टम पासवर्ड का उपयोग आपके पासफ़्रेज़ को डिक्रिप्ट करने और एजेंट में जोड़ने के लिए किया जाता है।

https://github.com/capocasa/systemd-user-pam-ssh

प्रस्तुत हर दूसरे समाधान पर लाभ यह है कि यह शून्य प्रयास के साथ बूट पर मैन्युअल रूप से ssh-add चलाने के बराबर सुरक्षा को जोड़ता है। इसके लिए किसी अतिरिक्त टूल की आवश्यकता नहीं है और इसमें एक अतिरिक्त निर्भरता है जो पहले से ही अधिकांश सिस्टम (ओपनएसएसएल) पर डिफ़ॉल्ट रूप से स्थापित है।


0

MacOS पर मेरा सेटअप इस प्रकार है (जैसे .zshrc, या .bash_profileबैश लोगों के लिए):

# Kill then Load the ssh-agent and set the necessary env variables it outputs
sshRestart() {
    # if all else fails
    # pkill -u $(whoami) ssh-agent;

    if [ -n "$SSH_AUTH_SOCK" ] ; then
        eval `/usr/bin/ssh-agent -k`
    fi
    eval `ssh-agent -s`
    ssh-add ~/.ssh/YOUR_KEY_FILE
    echo "Restarted SSH agent"
}

if [ -z "$SSH_AUTH_SOCK" ] || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]] ; then
    eval `ssh-agent -s` > /dev/null 2>&1
    ssh-add ~/.ssh/YOUR_KEY_FILE > /dev/null 2>&1
fi

|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]क्योंकि डिफ़ॉल्ट मान है हिस्सा MacOS पर आवश्यक है /private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners। अन्यथा @Thomas Nyman व्यापक उत्तर विफल रहता है क्योंकि $SSH_AUTH_SOCKहमेशा कुछ करने के लिए सेट किया गया है।

तब .zlogout(या .bash_logoutबैश लोगों के लिए):

if [ -n "$SSH_AUTH_SOCK" ] ; then
    eval `/usr/bin/ssh-agent -k`
fi

MacOS Mojave पर परीक्षण 10.14.5

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