जब आप मौजूदा स्क्रीन पर पुनः संलग्न होते हैं, तो आप स्वचालित रूप से वर्तमान ssh- एजेंट से कनेक्ट करने के लिए स्क्रीन कैसे प्राप्त करते हैं?


48

यदि आप ssh-agent चला रहे हैं (ssh-Agent-अग्रेषण से), जबकि ssh-agent ठीक काम कर रहा है, तो एक स्क्रीन सत्र शुरू करें। हालाँकि, यदि आप उस सत्र से अलग हो जाते हैं, तो लॉग आउट करें, फिर से लॉग इन करें (ssh-Agent अग्रेषण के साथ), और अपने स्क्रीन सत्र के लिए पुनः संलग्न करें, ssh- एजेंट का उपयोग काम नहीं करता है।

इसे कैसे सुधारा जा सकता है?

जवाबों:


41

1) आपकी SSH rc स्क्रिप्ट (~ / .ssh / rc) में आप एक विहित स्थान से "करंट" SSH_AUTH_SOCK तक प्रतीकात्मक लिंक स्थापित करेंगे। यहाँ मैं इसे bash (~ / .ssh / rc की सामग्री) में कैसे करता हूँ:

#!/bin/bash
if test "$SSH_AUTH_SOCK" ; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

(और 755 ~ / .shsh / आरसी chmod करने के लिए सुनिश्चित करें)। "परीक्षण" सिर्फ एक त्रुटि को प्रदर्शित करने से रोकने के लिए है यदि आप ssh- एजेंट नहीं चला रहे हैं (जैसे कि आप बिना ash)। उस आदेश का दूसरा भाग एक कैनोनिकल स्थान पर एक सिम्लिंक स्थापित करता है जो लॉगिन समय पर "वास्तविक" SSH_AUTH_SOCK को अपडेट करता है। यह ssh में एक शेल का उपयोग करने या सीधे एक कमांड को कॉल करने से स्वतंत्र है, "ssh -t स्क्रीन -RRD" के साथ भी काम करता है।

नोट: ~ / .ssh / rc का अस्तित्व sshd के व्यवहार को बदल देता है। विशेष रूप से, यह xauth नहीं कहेगा। अधिक जानकारी के लिए आदमी को sshd देखें, और इसे कैसे ठीक करें।

इसके अलावा, आपको "-v" का उपयोग ln के साथ नहीं करना चाहिए जैसे ही यह rsync-over-ssh को निम्नलिखित तारे के साथ तोड़ देगा:

$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]

2) अपने .screenrc में, आपको बस SSH_AUTH_SOCK को विहित स्थान पर ओवरराइड करने की आवश्यकता है:

setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock

ध्यान दें कि आप सेटेनव का उपयोग करते हैं कोई फर्क नहीं पड़ता कि आप किस शेल का उपयोग करते हैं; मुझे लगता है कि सेटेनव स्क्रीन सिंटैक्स है, न कि शेल।

समाधान मूल रूप से इस पद से अनुकूलित है , जो काम नहीं करता है, लेकिन सही विचार है।


यह मानता है कि आप पहले लॉगिन करते हैं, फिर स्क्रीन शुरू करते हैं। सही?
इन्नाम

1
यह कोई और तरीका कैसे हो सकता है? आप लॉग इन हुए बिना स्क्रीन कैसे शुरू करेंगे?

1
आप सही हे। यह सवाल बेवकूफी भरा था। लेकिन आपको लॉगिन करने की जरूरत है, एक शेल शुरू करें और वहां से स्क्रीन शुरू करें? मैं अक्सर "ssh -t some.machine स्क्रीन -R" जैसा कुछ करता हूं।
इन्नाम

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

SSH सॉकेट्स सेट करता है, यह कभी भी शेल को शुरू नहीं करता है। लेकिन यह टिप इतनी उपयोगी है कि मुझे लगता है कि मैं अपनी आदतों को बदल सकता हूं।
इन्नाम

23

मुझे लगता है कि यह @ सैंडिप-भट्टाचार्य के उत्तर के सरलीकरण के रूप में काम करता है। इसे अपनी ~/.bashrcफ़ाइल में रखें , और किसी भी वर्तमान में चल रहे स्क्रीन सत्र में निर्यात कमांड चलाएँ।

if [ -S "$SSH_AUTH_SOCK" ] && [ ! -h "$SSH_AUTH_SOCK" ]; then
    ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock

वह पढ़ता है "अगर $SSH_AUTH_SOCKएक सॉकेट है ( -S) और एक प्रतीकात्मक लिंक नहीं है ( ! -h), ज्ञात पथ पर एक नया प्रतीकात्मक लिंक बनाएं। सभी मामलों में, SSH_AUTH_SOCKज्ञात पथ को इंगित करने के लिए फिर से परिभाषित करें।"

! -hयदि आप इस अनेक बार चलाने से बचा जाता है एक परिपत्र संदर्भ बनाने।

इसके अलावा, यदि आप उपयोग करते हैं byobu, तो यह किसी भी कॉन्फ़िगर फ़ाइलों को संपादित करने की आवश्यकता के बिना, यह स्वचालित रूप से करता है।

एकमात्र बग जो मुझे इसमें मिला है ( byobuयह भी है) यदि आप एक दूसरा ssh -Aया ForwardAgentकनेक्शन खोलते हैं तो यह पहले सॉकेट को अधिलेखित कर देगा, और यदि आप पहले से दूसरे कनेक्शन को बंद करते हैं, तो आप अपना एकमात्र अच्छा सॉकेट खो देंगे।


1
इसके लिए भी काम करता है tmux
डेग होइदाहल

महान काम करता है, लेकिन दूरस्थ रूप से माउंट किए गए होम फ़ोल्डर्स का उपयोग करते समय टूट जाता है। उस स्थिति में, ~/.ssh/ssh_auth_sock_"$(hostname)"अपने सिमलिंक के लिए उपयोग करें। यह प्रत्येक होस्ट के लिए अलग-अलग सॉकेट रखेगा।
किब्बर

4

"ssh -t some.machine screen -R" बैश नहीं चलेगा और इसलिए जहां।

आप कोशिश कर सकते हैं: ssh -t some.machine bash -c "स्क्रीन -R"

(यह मानते हुए कि आप अपने खोल के रूप में बैश का उपयोग कर रहे हैं)

संपादित करें: वह "उत्तर" वास्तव में ऊपर दिए गए पहले उत्तर पर एक टिप्पणी है :)


"पहले दिए गए उत्तर" का मतलब कुछ भी नहीं है क्योंकि उत्तर बदल जाते हैं, जैसा कि वे पर वोट किए जाते हैं आदि। कृपया उस उत्तर से शेयर लिंक को शामिल करें जिसका आप संदर्भ दे रहे हैं, क्योंकि यह नहीं बदलेगा।
rjmunro

3

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

http://www.linux.com/archive/feature/134133

मूल बातें है ... मैं किसी दिए गए होस्ट के लिए मेरी .conrc में प्रक्रिया को स्वचालित करने के लिए एक lil स्क्रिप्ट को माणिक करूँगा। (मेरे ssh अग्रेषण भी करता है, इसलिए इन सभी अलग-अलग जगहों पर मैं अपने सर्वर के माध्यम से अपना कनेक्शन टनल कर सकता हूं)

ऑटोसो डिस्ट्रो में एक प्रोग्राम होना चाहिए जिसे रेकसन कहा जाता है (और .. वहाँ है!)

#!/bin/sh                                                                       
#
# sample script to use autossh to open up a remote screen
# session, or reconnect to an existing one. 
#
# $Id: rscreen,v 1.4 2002/05/07 17:54:13 harding Exp $
#
if [ "X$1" = "X" ]; then
    echo "usage: `basename $0` <host>"
    exit 1
fi

if [ "X$SSH_AUTH_SOCK" = "X" ]; then
    eval `ssh-agent -s`
    ssh-add $HOME/.ssh/id_rsa
fi

#AUTOSSH_POLL=600
#AUTOSSH_PORT=20000
#AUTOSSH_GATETIME=30
#AUTOSSH_LOGFILE=$HOST.log
#AUTOSSH_DEBUG=yes 
#AUTOSSH_PATH=/usr/local/bin/ssh
export AUTOSSH_POLL AUTOSSH_LOGFILE AUTOSSH_DEBUG AUTOSSH_PATH AUTOSSH_GATETIME 

autossh -M 20004 -t $1 "screen -e^Zz -D -R"

यह ssh / स्क्रीन समस्याओं के साथ मदद करनी चाहिए

अंत में, मेरे ssh- एजेंट को चालू रखने के लिए, मैं किचेन का उपयोग करता हूं, क्योंकि मैं एक शेल हेड की तरह हूं ... मुझे लगता है कि OSX के पास आपके एजेंट को रखने के लिए कुछ उपलब्ध है ...


2

यहाँ मैं प्रयोग विधि है:

SOCK=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep SSH_AUTH_SOCK) ; eval $SOCK ; export SSH_AUTH_SOCK
DISP=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep DISPLAY) ; eval $DISP ; export DISP

मैं आमतौर पर थिसिस कमांड के साथ एक उपनाम या शेल फ़ंक्शन सेट करता हूं:

function ssh-screen-auth() {
  SOCK=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep SSH_AUTH_SOCK)
  eval $SOCK
  export SSH_AUTH_SOCK
  DISP=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep DISPLAY)
  eval $DISP
  export DISPLAY
}

आपको नियमित अभिव्यक्ति ' स्क्रीन - (r | DR) ' को अपने स्क्रीन पर रीटेट करने के लिए उपयोग किए जाने वाले सटीक आदेशों के अनुकूल होना पड़ सकता है ।

  • पहली पंक्ति SSH_AUTH_SOCK वातावरण चर को " स्क्रीन -r " कमांड के प्रोसेस स्पेस में पढ़ती है, जिसे आपने अभी टाइप किया है और अपने वर्तमान शेल में मूल्य को अपडेट करता है।
  • दूसरी पंक्ति आवश्यक है यदि आप X11 कनेक्शनों को आगे करने के लिए " ssh -X " का उपयोग करते हैं : यह उसी तरह DISPLAY चर को अपडेट करता है ।

मेरे तरीके के साथ एक चेतावनी: अगर कंप्यूटर पर एक और " स्क्रीन " कमांड चल रही है तो चीजें गलत हो सकती हैं ।


-1 के अनावश्यक उपयोग के लिए sudo
0xC0000022L

1

मैं आमतौर पर अलग-अलग सर्वरों पर अपने कार्यस्थल पर लंबे समय तक (6+ महीने) सत्र चलता रहता हूं। इसलिए बार-बार पुन: प्रशिक्षण और व्यवहार्य ssh अग्रेषण एजेंट समस्याग्रस्त किया गया है। यह वही है जो मैंने अपने सिस्टम पर सेट किया है:

if [ -z "${STY}" -a -t 0 -a X${USER} = Xmyusername ]; then
    reattach () {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-screen"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-screen" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"} ;
    }

    screen -wipe
    echo 'starting screen... (type Cntl-C to abort)'
    sleep 5 && reattach
fi

अगर मैं बस स्टार्ट / रीटचिंग स्क्रीन के बिना रिमोट सर्वर पर लॉग इन करता हूं, तो दो "सॉकेट" होंगे, एक उपयोग में screenऔर दूसरा नए शेल द्वारा। दो "स्टार्टअप" सत्र नहीं होने चाहिए, लेकिन एक दूसरे सत्र का उपयोग अभी भी शुरू किया जा सकता है reattach -S new; इस स्थिति में, एजेंट को ~/.ssh/agent-screenमूल्य के साथ साझा किया जाएगा । एक काम करने वाले अग्रेषण एजेंट को वापस पाने के लिए, फिर मैं अलग हो जाऊंगा, वापस लॉग इन करूंगा। यह X${USER} = Xmyusernameसुनिश्चित करता है कि कोड को sudoउसी सर्वर पर नहीं बुलाया जाएगा ।


1

मैं क्या @apinstein मेरे लिए उपयोग कर रहा है की भिन्नता का उपयोग कर रहा .bashrc

case "$TERM" in
    screen)
           export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
        ;;
         *)
           if [[ -n "$SSH_AUTH_SOCK" ]]; then
               ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
           fi
        ;;
esac

यह मेरे स्क्रीन सत्र में चलने वाले सभी ऐप्स के लिए काम करता है। यह आपके स्क्रीन सत्र में सभी नए गोले के लिए काम करेगा। मौजूदा गोले के लिए आपको export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sockइसे काम करने के लिए मेजबान शेल पर चलने की आवश्यकता है ।

PS इसे एक स्वतंत्र उत्तर के रूप में जोड़ने के लिए खेद है, जबकि यह सिर्फ @ apinstein के उत्तर पर बनाया गया है। यह करना था क्योंकि स्टैकओवरफ्लो में टिप्पणियां कोड ब्लॉक का समर्थन नहीं करती हैं।


हमेशा सिम्लिंक और हमेशा निर्यात क्यों नहीं?
कोलिन एंडरसन

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

आह, ठीक है। यदि $ SSH_AUTH_SOCK पहले से लिंक नहीं है तो आपको केवल लिंक करना होगा। मेरी पोस्ट देखें superuser.com/a/424588/134212
Collin एंडरसन

0

मैंने इस सरल एक लाइनर की कोशिश की जैसा कि चलो स्क्रीन और ssh- एजेंट मित्र बनाते हैं और यह मेरे लिए काम करता है।

पहली बार टारगेट पर लॉगिन करें। केवल एक बार ही काम करें।

ssh -o StrictHostKeyChecking=no -C <userid>@<server>

पहली बार स्क्रीन लॉन्च करें। केवल एक बार ही काम करें।

eval `ssh-agent`; /usr/bin/screen -D -R -h 10000
ssh-add

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

ssh -o StrictHostKeyChecking=no -C -t <userid>@<server> ssh-agent /usr/bin/screen -D -R -h 10000

0

ये सभी वास्तव में अच्छे जवाब हैं मैं इसे थोड़ा अलग तरीके से करता हूं। एक नया ssh सत्र और reattach स्क्रीन शुरू करने के बाद, मैं SSH_AUTH_SOCKरूट बैश वातावरण की सामग्री के आधार पर पर्यावरण चर को रीसेट करता हूं । मुझे केवल ssh- एजेंट एक्सेस की आवश्यकता होती है जब मैं svn का उपयोग कर रहा हूं तो मैं SSH_AUTH_SOCKइन गोले में आवश्यक रूप से रीसेट करता हूं ।

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

SSH_AUTH_SOCK को रीसेट करने के लिए (इसे एक उपनाम बनाया जा सकता है)।

$ . ~/bin/screen_auth.sh

screen_auth.sh ऐसा दिखता है

# Find the pid of putty's bash shell
tty=`who | awk '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ { print substr($2, 5) }'`
pid=`ps -t $tty | grep bash | awk '{print $1}'`
# Find the SSH_AUTH_SOCK variable in its enviornment
auth_sock=`xargs --null --max-args=1 echo < /proc/$pid/environ | grep SSH_AUTH_SOCK`
eval "export $auth_sock"

0

ऊपर दिए गए सभी समाधान रेसिंग स्थितियों (या तो कई स्क्रीन सत्रों या कई एसएसएच कनेक्शनों में) से ग्रस्त हैं। एकमात्र सार्वभौमिक समाधान जिसके बारे में मैं सोच सकता हूं कि पहले SSH_AUTH_SOCK को SCREEN सर्वर प्रक्रिया को आगे बढ़ाएं screen -rऔर फिर प्रत्येक इंटरएक्टिव नॉन-बिल्डिन कमांड से पहले इसे BASH सत्र के अंदर खींच लें। दुर्भाग्य से स्क्रीन और बैश को इस तरह की समस्याओं के बारे में जागरूकता के बिना डिजाइन किया गया था, इसलिए इसे ठीक से लागू करना कठिन है (हालांकि दोनों परियोजनाओं के लिए फीचर अनुरोध पोस्ट करने में कभी देर नहीं होती है)। BASH सत्र के लिए इस मुद्दे को दूर करने का मेरा प्रयास था जो यहाँ पाया जा सकता है:

स्थापित करने के लिए:

  1. दोनों लिपियों में डाल $HOME/bin, निष्पादन योग्य बिट जोड़ें;
  2. सुनिश्चित करें कि PATH में $HOME/binइससे पहले चला जाता है /usr/bin:

    पथ = $ घर / बिन: $ पथ

  3. इसे अपने में जोड़ें .bashrc:

    स्रोत $ घर / बिन / स्क्रीन-सहायक सेटअप

अब आप SSH सत्र के अंदर SCREEN सत्र बनाने की कोशिश कर सकते हैं, अलग कर सकते हैं, डिस्कनेक्ट कर सकते हैं, कनेक्ट कर सकते हैं और reattach कर सकते हैं और उम्मीद है कि ssh-add -lसही ढंग से अपनी चाबियाँ दिखाएं।


ध्यान दें, वह स्थायी ssh-agentडेमन (जैसा कि यहां बताया गया है कि superuser.com/a/412052/376867 ) रेसिंग की स्थिति से ग्रस्त नहीं है, लेकिन बासी कीरिंग से पीड़ित हैं। और जो अधिक महत्वपूर्ण है, स्क्रीन सत्र के साथ (या यहां तक ​​कि उल्लेखित पोस्ट के मामले में रिबूट तक) दूरस्थ होस्ट पर अपनी सभी चाबियाँ छोड़ना बहुत सुरक्षित नहीं है।
मिडनोक

0

मैंने अन्य उत्तरों के माध्यम से स्किम किया और मुझे नहीं मिला। यहाँ मैं क्या उपयोग है। ~/.screenrc-wrapperनिम्नलिखित सामग्री के साथ एक फ़ाइल बनाएँ :

escape ^xx
bindkey ^Ad detach

और इसे अपने में जोड़ें ~/.bashrc(या ~/.zshrcयदि आप इसका उपयोग करते हैं):

  if echo $TERM | grep -v 'screen' && ! screen -x -SU wrapper; then
      if echo $TERM | grep -v 'screen' && ! screen -x -SU main; then
      screen -c ~/.screenrc-wrapper -SU wrapper ssh-agent screen -SU main
      fi
  fi

इस तरह आप दो स्क्रीन सत्रों का उपयोग करेंगे - एक "आवरण" है और एक भीतर का है। जब आप लॉग आउट करते हैं तो यह बाद को भी जीवित रखेगा और इस पर ssh-agent होता रहेगा। एक और अच्छी विशेषता यह है कि यह आपके विंडो सेटअप को याद रखेगा - यदि आप विभाजित विंडो का उपयोग करते हैं, तो यह बहुत उपयोगी हो सकता है।

आप इस सुविधा को मेरे डॉटफाइल्स के संदर्भ में पा सकते हैं ।

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