लॉगिन पर ssh-Agent प्रारंभ करें


262

मेरे पास SSH उपनाम का उपयोग करके Bitbucket.com से दूरस्थ Git रेपो खींचने के रूप में एक साइट है। मैं अपने सर्वर पर ssh- एजेंट को मैन्युअल रूप से शुरू कर सकता हूं लेकिन मुझे हर बार एसएसएच के माध्यम से लॉगिन करने पर ऐसा करना होगा।

मैं स्वयं ssh-agent शुरू करता हूं:

eval ssh-agent $SHELL

फिर मैं एजेंट जोड़ता हूं:

ssh-add ~/.ssh/bitbucket_id

तब यह पता चलता है कि जब मैं करता हूं:

ssh-add -l

और मैं जाने के लिए अच्छा हूँ। क्या इस प्रक्रिया को स्वचालित करने का कोई तरीका है इसलिए मुझे हर बार लॉगिन करने की आवश्यकता नहीं है? सर्वर RedHat 6.2 (सैंटियागो) चला रहा है।


2
आप जो भी लॉगिन करना चाहते हैं, उसे हर बार .profile (टर्मिनल लॉगिन) या .xinitrc (GUI लॉगिन के लिए) में करना चाहिए।
बमर

1
आह! मैं .bash_profile ... का उपयोग कर रहा था ... .profile और .bash_profile के बीच क्या अंतर है?
Pathsofdesign

1
सुनिश्चित नहीं हैं कि आप पहली बार इस तरह से कमांड क्यों चला रहे हैं। ssh-agent <command>के <command>एक उपप्रकार के रूप में चलता है ssh-agent, इसलिए आप एक नया शेल शुरू कर रहे हैं। मुझे लगता है कि आप चाहते हैं eval ssh-agent
बमर

9
.bash_profileबैश करने के लिए विशिष्ट है, .profileसभी POSIX गोले के लिए सामान्य है। bashके लिए पहले दिखेगा .bash_profile, फिर डिफ़ॉल्ट के लिए .profile
बमर

5
ssh-agent"मानक" (POSIX- संगत) शेल के लिए स्पॉन का सही तरीका है eval $(ssh-agent -s)। ध्यान दें कि आपको यह सुनिश्चित करना होगा कि जब आप लॉग आउट करते हैं तो आपको एजेंट से ठीक से छुटकारा मिल जाए, इसलिए यह भी सलाह दी जाती है कि एजेंट शुरू करने वाली लाइन के बाद trap 'kill $SSH_AGENT_PID' EXITआपके अंदर डाल दिया जाए .profile
कोस्टिक्स

जवाबों:


368

कृपया इस लेख के माध्यम से जाना। आपको यह बहुत उपयोगी लग सकता है:

http://mah.everybody.org/docs/ssh

बस किसी दिन उपरोक्त लिंक गायब हो जाने पर, मैं नीचे दिए गए समाधान के मुख्य भाग को कैप्चर कर रहा हूं:

डैनियल स्टारिन के माध्यम से जोसेफ एम। रीगल का यह समाधान:

इसको अपने में जोड़ें .bash_profile

SSH_ENV="$HOME/.ssh/agent-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

यह संस्करण विशेष रूप से अच्छा है क्योंकि यह देखेगा कि आपने पहले से ही ssh-Agent की शुरुआत की है और यदि यह नहीं मिल रहा है, तो इसे शुरू करेंगे और सेटिंग्स को स्टोर करेंगे ताकि अगली बार जब आप शुरू करें खोल।


8
मशीन रिस्टार्ट करना आवश्यक नहीं है। आप अपने वर्तमान शेल सत्र में केवल पुनः लोड .bash_profileकर सकते हैं source ~/.bash_profile। मशीन रीस्टार्ट भी काम करेगा क्योंकि यह नए कॉन्फिगरेशन को वैसे भी लोड करेगा।
लिटमस जूल

11
उपयोग SSH_ENV="$HOME/.ssh/env"(अर्थात सिर्फ / पर्यावरण नहीं) क्यों? sshd ~ / .ssh / पर्यावरण (मैन पेज देखें: PermitUserEnvironment) का उपयोग करता है। गितुब भी उनके समाधान में यह सलाह देते हैं - help.github.com/articles/…
एंड्रयू मर्फी

7
इस स्क्रिप्ट ने मेरे लिए काम किया जब मैंने इसे अपनी ~ / .bashrc फ़ाइल (मेरे ~ / .profile या ~ / .bash_profile) में नहीं डाला। पहली बार जब मैं पासफ़्रेज़ के लिए संकेत करता हूं तो यह एक स्थानीय कंसोल खोलता है, उस बिंदु से सब कुछ आगे के संकेत के बिना काम करता है। चीयर्स।
andrew pate

3
.Bashrc में ssh-agentस्टार्ट कमांड जोड़ने से scpकमांड काम नहीं करेगा ।
डेज़ानवु

5
फिर भी कष्टप्रद ... आपको हर बार जब आप लॉग इन करते हैं तो यह करना पड़ता है ... भले ही आप ssh का उपयोग न करें। हर बार ssh कहलाने के लिए इस आग को बुझाने की जरूरत है ... और आदर्श रूप से, आपको यह कॉन्फ़िगर करने में सक्षम होना चाहिए कि कौन सी मेजबानों को लोड करने की कुंजी है।
एरिक एरोनेस्टी जूल

97

आर्क लिनक्स पर, निम्नलिखित कार्य वास्तव में बहुत अच्छा है (सभी सिस्टम-आधारित डिस्ट्रोस पर काम करना चाहिए):

निम्नलिखित को डालकर एक systemd उपयोगकर्ता सेवा बनाएँ ~/.config/systemd/user/ssh-agent.service:

[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

सॉकेट के लिए एक पर्यावरण चर है सेटअप खोल ( .bash_profile, .zshrc, ...):

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

सेवा सक्षम करें, इसलिए इसे लॉगिन पर स्वचालित रूप से शुरू किया जाएगा, और इसे शुरू करें:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

अपनी स्थानीय ssh config फाइल में निम्नलिखित विन्यास सेटिंग जोड़ें ~/.ssh/config(यह SSH 7.2 के बाद से काम करता है):

AddKeysToAgent  yes

यह ssh क्लाइंट को हमेशा एक रनिंग एजेंट की कुंजी जोड़ने का निर्देश देगा, इसलिए इसे पहले से ssh-add करने की कोई आवश्यकता नहीं है।


3
मुझे यह टिप्पणी उबंटू में करने की कोशिश करते हुए मिली। यह स्टार्टअप स्क्रिप्ट में कुछ हैक करने की तुलना में बिल्ट इन सिस्टम के साथ बहुत अधिक अच्छी तरह से खेलता हुआ प्रतीत होता है, कम से कम मेरे ज्ञान को यह बताता है कि सिस्टम कैसे काम करता है।
ज्यूस

मैंने Ubuntu 16.04 LTS पर यह कोशिश की। दुर्भाग्य से, प्रत्येक शेल प्रक्रिया अपनी व्यक्तिगत ssh-agentप्रक्रिया चाहती है। डॉक्स पढ़ने के बाद भी शायद मुझे ज्ञान की कमी है।
Daisuke Aramaki

आप टाइप = सरल का भी उपयोग कर सकते हैं । wiki.archlinux.org/index.php/…
हंस-जे। शमिद

2
तो यह समाधान मूल रूप से एक systemd सेवा को स्थापित / कॉन्फ़िगर करना है (लेकिन केवल उपयोगकर्ता के लिए)?
ट्रेवर बॉयड स्मिथ

SSH_AGENT_PIDहालांकि, यह पर्यावरण चर को निर्धारित नहीं करेगा , :(
MrMeszaros

73

पुराना सवाल है, लेकिन मैं एक समान स्थिति में आया था। मत सोचो कि उपरोक्त उत्तर पूरी तरह से प्राप्त करता है कि क्या आवश्यक है। लापता टुकड़ा है keychain; यदि यह पहले से ही स्थापित नहीं है, तो इसे स्थापित करें।

sudo apt-get install keychain

फिर निम्नलिखित पंक्ति को अपने में जोड़ें ~/.bashrc

eval $(keychain --eval id_rsa)

ssh-agentयदि यह नहीं चल रहा है तो यह शुरू हो जाएगा, अगर यह है तो इसे कनेक्ट करें, ssh-agentपर्यावरण चर को अपने शेल में लोड करें, और अपनी ssh कुंजी लोड करें।

id_rsaजो भी ~/.sshआप लोड करना चाहते हैं, उसमें निजी कुंजी बदलें ।

संदर्भ

/unix/90853/how-can-i-run-ssh-add-automatically-without-password-prompt


दिए गए निर्देशों के अनुसार चाबी का गुच्छा मेरे लिए काम नहीं करता है। मैंने .bash_profile को जोड़ा और ssh अभी भी हर बार पासवर्ड मांगता है। मैंने इसे एक ही शेल में कई बार आज़माया। कोई पाँसा नहीं। मूल ssh- एजेंट के दृष्टिकोण पर वापस जा रहा है
javadba

जोड़े eval keychain --eval id_[yourid file]के लिए .bashrc
xelber

4
मैंने स्टैकऑवरफ्लो कमेंट फॉर्मेटिंग के कारण एक समाधान पर शोध करते हुए 20 मिनट बिताए। प्रति ऊपर xelber की टिप्पणी, सही समाधान है eval `keychain --eval id_[yourid file]`करने के लिए .bashrc। मौजूदा ssh- एजेंट तक पहुँचने के लिए वर्तमान शेल के लिए पर्यावरण चर का मूल्यांकन करने के लिए बैकटिक्स आवश्यक है।
जेम्स

2
यह सही और सरल उपाय है। यदि आप किचेन कमांड निष्पादित होने पर लॉग नहीं देखना चाहते हैं, तो आप -qशांत मोड के लिए विकल्प जोड़ सकते हैं । किचेन के
Diki Ananta

4
Thx, यह अब तक का सबसे सुरुचिपूर्ण समाधान है।
ग्रीन्सपैंड

37

स्वीकृत समाधान में निम्नलिखित कमियां हैं:

  • इसे बनाए रखना जटिल है;
  • यह भंडारण फ़ाइल का मूल्यांकन करता है जो त्रुटियों या सुरक्षा उल्लंघन का कारण हो सकता है;
  • यह एजेंट शुरू होता है, लेकिन इसे बंद नहीं करता है जो इग्निशन में चाबी छोड़ने के बराबर है।

यदि आपकी कुंजियों को पासवर्ड टाइप करने की आवश्यकता नहीं है, तो मैं निम्नलिखित समाधान सुझाता हूं। निम्नलिखित को अपने .bash_profile अंत में जोड़ें (अपनी आवश्यकताओं के लिए महत्वपूर्ण सूची संपादित करें):

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

इसके निम्नलिखित फायदे हैं:

  • बहुत सरल समाधान;
  • एजेंट सत्र समाप्त होता है जब बैश सत्र समाप्त होता है।

इसके संभावित नुकसान हैं:

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

ध्यान दें कि कई ssh-agentप्रक्रिया एक नुकसान नहीं है, क्योंकि वे अधिक मेमोरी या सीपीयू समय नहीं लेते हैं।


मुझे GIT बैश का उपयोग करके विंडोज 10 में $ Home के बाहर एक डायरेक्टरी में SSH कीज़ मिली हैं। RSA के लिए रास्ता बदलना यह काम करने के लिए मुझे बस इतना करना था। TYVM!
kayleeFrye_onDeck

7
मेरा तर्क है कि "यदि आपकी कुंजी को पासवर्ड टाइप करने की आवश्यकता नहीं है" तो इग्निशन में चाबी छोड़ने के बराबर है।
बजे ब्रूनो ब्रोंस्की

कम से कम, यह आपके अपने मेजबान पर है, कहीं नेटवर्क पर नहीं।
midenok

1
"मैं तर्क दूंगा कि" अगर आपकी कुंजी को पासवर्ड टाइप करने की आवश्यकता नहीं है "तो प्रज्वलन में कुंजी को छोड़ने के बराबर है।" <- स्पष्ट करें कि कैसे ?? क्योंकि चाबियाँ पासवर्ड की तुलना में कहीं अधिक लचीली होती हैं, जिसे दूर करना आसान होता है (क्या? आप केवल पूर्ण पहुंच वाले sudo उपयोगकर्ताओं के लिए कुंजियों का उपयोग कर रहे हैं? Tsk tsk)। उपयोगकर्ताओं के कई प्रोफाइल के लिए कुंजियों के एकाधिक सेट। यदि आप कुछ भी स्वचालित करना चाहते हैं (जैसे कि तैनाती, या चेक को समाप्त करने के लिए) तो "ऑर्केस्ट्रेशन" के दौरान पासवर्ड में लगातार शुभकामनाएं।
स्कॉट प्रिव

2
ऐसा मत करो। पासवर्ड रहित कुंजी एक बुरा अभ्यास है।
user48678

26

इसे अपने में जोड़ें ~/.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जब तक यह चलता रहेगा तब तक यह उसी तरह से पुन: उपयोग करता रहेगा।


यदि हमारे पास कई कुंजियाँ होती हैं और उनका नाम नहीं होता तो हम इसका क्या उपयोग करते हैं ~/.ssh/id_rsa? ऐसा लगता है कि ssh-addआपके उत्तर का हिस्सा कुंजियों के लिए डिफ़ॉल्ट फ़ाइल नामों की अपेक्षा करता है।
गेब्रियल स्टेपल्स

हाँ। मेरा मानना ​​है कि यदि आवश्यक हो तो आप फ़ाइल के नाम को अंतिम पंक्ति के बहुत अंत तक जोड़ सकते हैं
कॉलिन एंडरसन

लेकिन आप अभी भी एक स्क्रिप्ट को स्वचालित नहीं कर सकते हैं उदाहरण के लिए मैन्युअल रूप से पासवर्ड दर्ज किए बिना जीआईटी सामान खींच दें? उससे कैसे बचें?
त्रैनोनास

7

इसलिए मैं ऊपर वर्णित दृष्टिकोणों का उपयोग करता था, लेकिन मैं अपने अंतिम बैश सत्र समाप्त होने पर एजेंट को मरने के लिए पसंद करता हूं। यह अन्य समाधानों की तुलना में थोड़ा लंबा है, लेकिन इसका मेरा पसंदीदा तरीका है। मूल विचार यह है कि पहला बैश सत्र ssh-agent शुरू करता है। फिर प्रत्येक अतिरिक्त बैश सत्र चेक फ़ाइल ( ~/.ssh/.agent_env) के लिए। अगर वहाँ है और वहाँ एक सत्र चल रहा है तो पर्यावरण का स्रोत है और सॉकेट फ़ाइल में एक हार्डलिंक बनाना है /tmp(मूल सॉकेट फ़ाइल के समान फ़ाइल सिस्टम पर होना चाहिए)। जैसे ही बैश सत्र बंद होता है, प्रत्येक अपना हार्डलिंक हटा देता है। बंद करने के लिए अंतिम सत्र में पाया जाएगा कि हार्डलिंक में 2 लिंक (हार्डलिंक और मूल) हैं, प्रक्रियाओं को हटाने से सॉकेट और प्रक्रिया को मारने से 0 का परिणाम होगा, अंतिम बैश सत्र बंद होने के बाद एक स्वच्छ वातावरण होगा।

# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents           
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
    # if no agents or environment file is missing create a new one
    # remove old agents / environment variable files
    kill $agent running
    rm ~/.ssh/.agent_env 

    # restart
    eval `ssh-agent` 
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env             
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env             
fi

# create our own hardlink to the socket (with random name)           
source ~/.ssh/.agent_env                                                    
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock                                        
ln -T $SSH_AUTH_SOCK $MYSOCK                                                
export SSH_AUTH_SOCK=$MYSOCK                                                

end_agent()                                                                     
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`                             
    if [[ "$nhard" -eq 2 ]]; then                                               
        rm ~/.ssh/.agent_env                                                    
        ssh-agent -k                                                            
    fi                                                                          
    rm $SSH_AUTH_SOCK                                                           
}                                                                               
trap end_agent EXIT                                                             
set +x              

अगर हम इसे किसी अन्य शेल (अन्य तब BASH) के लॉगिन पर BASH स्क्रिप्ट के रूप में चलाते हैं, तो यह भी सही है?
होइजुई

7

अभी तक एक और समाधान जोड़ने के लिए: P, मैं @spheenik और @ Collin-anderson के समाधानों के संयोजन के साथ गया था।

 # Ensure that we have an ssh config with AddKeysToAgent set to true
 if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
     echo "AddKeysToAgent  yes" >> ~/.ssh/config
 fi
 # Ensure a ssh-agent is running so you only have to enter keys once
 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

थोड़ा और सुरुचिपूर्ण हो सकता है लेकिन यह सरल और पठनीय है। यह समाधान:

  • सुनिश्चित करता AddKeysToAgent yesहै कि आपके ssh कॉन्फिग में है इसलिए उपयोग करने पर चाबियां अपने आप जुड़ जाएंगी
  • आपको लॉगिन पर किसी भी पासफ़्रेज़ को दर्ज करने के लिए संकेत नहीं देता है (फिर, पहले उपयोग पर एक बार पासफ़्रेज़ दर्ज करने पर)
  • यदि यह पहले से ही शुरू नहीं हुआ है, तो चुपचाप एक ssh- एजेंट शुरू कर देता है

टिप्पणियाँ स्वागत :)


1
इसने मेरे लिए पूरी तरह से काम किया। कुबंटू पर मैंने इसे .profile में डाल दिया।
Shai

1
AddKeysToAgent yesसेटिंग के बारे में जानकर अच्छा लगा । धन्यवाद।
कोलिन एंडरसन

3

मैंने इसे / etc / प्रोफाइल - सिस्टम वाइड (या उपयोगकर्ता स्थानीय .profile , या _.bash_profile_) में जोड़कर इसे हल किया :

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`who am i |awk '{print $1}'`

if pgrep -u $WHOAMI $SERVICE >/dev/null
then
    echo $SERVICE running.
else
    echo $SERVICE not running.
    echo starting
    ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env

यदि वर्तमान उपयोगकर्ता के लिए नहीं चल रहा है, तो यह एक नया ssh- एजेंट शुरू करता है या यदि चल रहा है तो ssh- एजेंट env पैरामीटर को फिर से सेट करता है।


यह बताने के लिए धन्यवाद कि एजेंट पहले से ही चल रहा है तो कैसे बताएं!
माइक मैक्सवेल

कैसे if pgrep -u $WHOAMI $SERVICE >/dev/nullकाम करता है ?
जोश डेसमंड

3

मछली के खोल के उपयोगकर्ता इस स्क्रिप्ट का उपयोग उसी कार्य को करने के लिए कर सकते हैं ।

# content has to be in .config/fish/config.fish
# if it does not exist, create the file
setenv SSH_ENV $HOME/.ssh/environment

function start_agent                                                                                                                                                                    
    echo "Initializing new SSH agent ..."
    ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
    echo "succeeded"
    chmod 600 $SSH_ENV 
    . $SSH_ENV > /dev/null
    ssh-add
end

function test_identities                                                                                                                                                                
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $status -eq 0 ]
        ssh-add
        if [ $status -eq 2 ]
            start_agent
        end
    end
end

if [ -n "$SSH_AGENT_PID" ] 
    ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    end  
else
    if [ -f $SSH_ENV ]
        . $SSH_ENV > /dev/null
    end  
    ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    else 
        start_agent
    end  
end

2

मैं इसके लिए ssh- पहचान उपकरण का उपयोग करता हूं ।

इसके मैन- पेज से:

ssh-identity - शुरू करें और आवश्यक के रूप में ssh- एजेंट और लोड पहचान का उपयोग करें।


1

कई स्रोतों से कुछ हल करने की कोशिश की, लेकिन सभी बहुत ज्यादा परेशानी की तरह लग रहे थे। अंत में मुझे सबसे आसान मिला :)

यदि आप अभी तक zsh और oh-my-zsh से परिचित नहीं हैं, तो इसे इंस्टॉल करें। आप इसे प्यार करेंगे :)

फिर संपादित करें .zshrc

vim ~/.zshrc

खोजने के pluginsअनुभाग और उपयोग करने के लिए इसे अद्यतन ssh-agentइसलिए की तरह:

plugins=(ssh-agent git)

और बस यही! आप होगा ssh-agentहर बार और चल रहा है कि आप अपने खोल शुरू


1

मुझे आपके उत्तर बहुत पसंद हैं। इसने cygwin / linuxमेजबानों से बहुत आसान काम किया । मैंने इसे सुरक्षित बनाने के लिए शुरू और अंत कार्यों को संयुक्त किया।

SSH_ENV="$HOME/.ssh/.agent_env"

function start_agent {
    echo "Initialising new SSH agent..."

    eval `/usr/bin/ssh-agent`
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ${SSH_ENV}
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ${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

# create our own hardlink to the socket (with random name)
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK

end_agent()
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
    if [[ "$nhard" -eq 2 ]]; then
        rm ${SSH_ENV}
        /usr/bin/ssh-agent -k
    fi
    rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.