ssh- एजेंट और स्क्रीन


8

StackOverflow पर कुछ समय पहले, मैंने ssh-agent और crontab के बारे में यह प्रश्न पूछा था । अब मेरे पास ssh-agent और linux सिस्टम पर स्क्रीन के बारे में एक समान प्रश्न है।

इसलिए, मेरे मैक पर, ssh- एजेंट सिस्टम स्टार्टअप पर लॉन्च करता है, इसलिए यह हमेशा मेरे लिए उपलब्ध है। मुझे लगता है कि यह मेरे linux (redhat el5 / fedora) के तहत सच होगा अगर मैं एक्स-विंडोज का उपयोग कर रहा था। हालाँकि, यह एक दूरस्थ सर्वर मशीन है और मैं हमेशा ssh के माध्यम से लॉग इन कर रहा हूँ।

मैं ssh- कुंजियों को ठीक से स्थापित करना पसंद करूंगा, ताकि मुझे svn अपडेट या कमिटमेंट के दौरान कई बार अपना पासवर्ड दर्ज न करना पड़े। मैं प्रति सत्र एक बार अपने पासफ़्रेज़ में टाइप करने के लिए खुश हूं, और मैं अपनी टीम को पासवर्ड-कम ssh-keys होने से हतोत्साहित करता हूं।

एक संक्षिप्त चमकते क्षण के लिए, ऐसा लग रहा था कि मेरे .bash_profile में "eval` ssh-agent -s` "करना, जब मैंने लॉग-आउट किया, तो ssh-agent को मारने के लिए एक कमांड के साथ जोड़ा जाएगा। हालांकि, हम लंबे समय तक चलने वाले इंटरैक्टिव कार्यक्रमों और विकास के वातावरण का प्रबंधन करने के लिए स्क्रीन का भारी उपयोग करते हैं। यदि आप ssh-Agent को शुरू या बंद करते हैं जैसा कि मैंने अभी वर्णित किया है, तो यह तब मारा जाता है जब आप टर्मिनल से बाहर निकलते हैं, और स्क्रीन के उप-सत्र जो उस ssh- एजेंट उदाहरण का जिक्र करते थे, को छोड़ दिया जाता है।

तो ... मैं एक कंसोल उपयोगकर्ता कैसे हो सकता हूं, जो स्क्रीन का उपयोग करता है, जो अपनी ssh- कीज़ के साथ पासवर्ड का उपयोग करता है, जिसे लगातार पासफ़्रेज़ में टाइप करने की ज़रूरत नहीं है?

जवाबों:


4

निम्नलिखित सेटअप के साथ, आपको इनवॉइस करने के लिए किसी भी आवरण की आवश्यकता नहीं होगी screen। इसके अलावा, यह /tmp(परिणामी सुरक्षा जोखिमों के साथ) उपयोग करने से बचता है ।

  1. सुनिश्चित करें कि आपके पास एक ~ / tmp निर्देशिका है:

    mkdir ~/tmp
    
  2. .screenrcनिम्नलिखित पंक्ति में जोड़ें :

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • यह सुनिश्चित करता है कि अंदर screen, sshगर्तिका को हमेशा एक ही स्थान पर देखता है, बदले पथ के बजाय।
    • setenvजब भी यह स्क्रीन हो और शेल कमांड न हो, तो आपको जो भी खोलना है, उसका उपयोग करना चाहिए ।
  3. .bash_profileनिम्नलिखित पंक्ति में जोड़ें :

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • यह निश्चित स्थान (जहां sshदिखता है) से वास्तविक एक से लिंक होगा , और शुरू होने के बाद दिखाई देगा ssh-agent
    • का उपयोग करते हुए [ -n "$SSH_AUTH_SOCK" ]जब ठीक से त्रुटियों को रोकने जाएगा SSH_AUTH_SOCKसेट नहीं है।
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]स्क्रीन सत्रों को $ HOME / tmp / ssh-agent-screen से जोड़ने से रोकेंगी, यदि स्क्रीन स्रोत .bash_profile
  4. इसके बजाय शुरू करने के ssh-agentमें .bash_profile, आप के साथ जोड़ने पर विचार कर सकते ssh -A(उपयोग करने के लिए एजेंट अग्रेषण और रिमोट मशीन उपयोग अपने एजेंट बनाना)।

इस सेटअप के बाद, आप केवल मानक स्क्रीन कमांड का उपयोग कर सकते हैं। आपको केवल मौजूदा सत्रों को फिर से बनाने या मैन्युअल रूप से SSH_AUTH_SOCK को चरण 2 के निश्चित स्थान पर सेट करने की आवश्यकता होगी।

विचार के लिए इस वेबसाइट को क्रेडिट ; मैंने प्रयोग करने से परहेज किया /tmpयह उत्तर समान है लेकिन अतिरिक्त उपनाम का उपयोग करता है।


2

क्या आप इसके बजाय एक इनस्क्रिप्ट से ssh-agent लॉन्च कर सकते हैं .bash_profile? उदाहरण के लिए, मैं रख सकता हूँ

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

के उपयुक्त भाग में /etc/conf.d/local, हालांकि आरएचईएल / फेडोरा शायद एक अलग प्रणाली का उपयोग करता है। जैसा कि आपने अपनी टिप्पणी में बताया है, टर्मिनल सत्रों को एजेंट से जुड़ने में सक्षम होने की आवश्यकता होगी, यही कारण है कि वह कमांड .ssh_agent_envउपयोगकर्ता के घर निर्देशिका में फ़ाइल बनाता है । फिर आप जोड़ सकते हैं

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

में है .bash_profile

एक और चीज जो आप कर सकते हैं, वह निम्नलिखित है .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

जो ssh-agentकेवल तभी शुरू होगा जब वह पहले से नहीं चल रहा हो। फिर आपको इसे मारने की जरूरत नहीं है।

दूसरे सुझाव के लिए थोड़ा अलग विकल्प के रूप में, किसी ssh-agentप्रक्रिया के अस्तित्व की जाँच करने के बजाय , आप फ़ाइल के अस्तित्व की जाँच कर सकते हैं ~/.ssh_agent_env

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

यदि सब कुछ ठीक से काम करता है, तो दोनों तरीकों के बीच कोई महत्वपूर्ण अंतर नहीं होना चाहिए।


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

@khedron: हां, लेकिन आपको /etc/conf.d/localएजेंट का उपयोग करने वाले प्रत्येक उपयोगकर्ता के लिए ssh-agentप्रति उपयोगकर्ता एक अलग प्रक्रिया शुरू करने के लिए एक (या अपने समकक्ष) एक लाइन डालनी होगी । यदि, जैसा कि आप कहते हैं, आपके पास बड़ी संख्या में उपयोगकर्ता नहीं हैं, तो यह बहुत बुरा नहीं होगा। आप एजेंट को संलग्न करने वाले टर्मिनल सत्रों के बारे में एक अच्छा बिंदु (जो मैं विचार करना भूल गया) उठाता हूं; उत्तर के लिए मेरा संपादन देखें।
डेविड


2

बेहतर तरीका ssh एजेंट अग्रेषण ( -Aविकल्प) का उपयोग करना है। यह ssh का उपयोग करने वाले व्यक्ति को उस मशीन पर चल रहे ssh- एजेंट से कुंजियों का उपयोग करने की अनुमति देता है जिससे वे आ रहे हैं, संभवत: वे जिस कार्य केंद्र में वास्तव में बैठे हैं।


यह एक हमलावर को भी अनुमति देता है जो आपके खाते को अन्य मशीनों पर खातों से समझौता करने के लिए कहता है जो उस एजेंट तक पहुंच सकते हैं। इसलिए मैं ssh एजेंट को न्यूनतम रखने की कोशिश करता हूं।
पॉल प्राइस

2

ssh एजेंट फ़ॉरवर्डिंग का अनुसरण करने के लिए, आप पाएंगे कि डिफ़ॉल्ट रूप से अग्रेषित ssh क्रेडेंशियल आपके स्क्रीन सत्र के लिए उपलब्ध नहीं होंगे, जब आप लॉग आउट करते हैं, तो लॉग इन करें और अपने sesssion को पुनः संलग्न करें।

आप इसके आस-पास प्राप्त कर सकते हैं, हालांकि, स्क्रीन पर SSH_AUTH_SOCK वातावरण चर सेट करके कुछ अच्छी तरह से जाना जाता है, और उस प्रसिद्ध स्थान को आपके वर्तमान स्थिति सॉकेट में अपडेट किया जा सकता है।

मैं इस शेल फ़ंक्शन का उपयोग स्क्रीन पर फिर से दर्ज करने और ssh ऑरिजनल सॉक को ठीक करने के लिए करता हूं:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

और मेरे पास यह है मेरी .screenrc:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

उम्मीद है की यह मदद करेगा।


/ Tmp का उपयोग करने का अर्थ है कि मशीन पर कोई भी आपकी किसी भी फाइल को देख सकता है, यदि वह उनका मार्ग जानता है।
ब्लिसॉर्बलेड

1

अगर मैं आपको सही समझ रहा हूं, तो आप बस एक स्क्रीन सत्र चाहते हैं, जिसे आप कभी-कभी अलग कर लेते हैं और फिर कभी ssh- एजेंट (आपके निजी कुंजी पासवर्ड) के पासवर्ड को फिर से दर्ज नहीं करना चाहते हैं।

मुझे लगता है कि स्क्रीन को शुरू करने का सबसे आसान तरीका है, सब-एजेंट को सब शेल के साथ शुरू करना और फिर उस सब शेल में रहना। अर्थात

screen
ssh-agent bash
ssh-add   # enter your password once

# some commands, some logins and logouts to remote servers via ssh public key

# <ctrl>+<a>, <ctrl>+<d> to detach screen
# you can now logout from this computer
# login again

# reattach to your screen
screen -r
# ssh-agent is still running

अनिवार्य रूप से मैं यही करता हूं। मैं ssh- एजेंट शक्तियों के रूप में अंदर "टैब" में से एक को लेबल करने के लिए स्क्रीन का उपयोग करता हूं, और svn काम के लिए उपयोग करता हूं, आदि। एक अतिरिक्त शिकन है जहां मैं ssh-agent को कई घंटों के बाद reauthorize करने के लिए मजबूर करता हूं, लेकिन हाँ। यह मूल रूप से मैं कहाँ पर हूँ।
माइकल एच।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.