पुन: संलग्न करने पर मुझे tmux में env var को फिर से कैसे सेट करना है?


37

मैं मुख्य रूप से एक मैक पर काम करता हूं और ssh / tmux अपने काम करने के लिए एक लिनक्स मशीन से जुड़ता हूं। मेरे पास Linux मशीन पर ssh-agent चल रहा है। मेरे पास है

set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"

मेरे में .tmux.conf। फिर भी, जब भी मैं इस सत्र में पुन: संलग्न होता हूं, मुझे दौड़ना पड़ता है

tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

नई tmux विंडोज़ के लिए $SSH_AUTH_SOCKसही तरीके से सेट करने के लिए । मैं ऐसा नहीं करना पसंद करूंगा। कोई विचार?

अद्यतन करें

मुझे लगता है कि मैं इसे अच्छी तरह से नहीं समझा रहा हूँ। यहाँ एक दूरस्थ मशीन पर एक खोल खोलने का मेरा कार्य है:

sshh () {
    tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}

जब tmux इस ssh आदेश चलाता है, $SSH_AUTH_SOCKहै नहीं निर्धारित करते हैं, भले ही यह है अपने स्थानीय वातावरण में सेट। अगर मैंने setenvऊपर के कमांड के साथ tmux के वातावरण में इसे रखा , तो सब कुछ ठीक है। मेरा सवाल यह है कि मुझे सेटेनव कमांड को आखिर क्यों चलाना है?

अपडेट २

अधिक जानकारी:

जब मैं किसी मौजूदा सत्र $SSH_AUTH_SOCKसे जुड़ता हूं, तो tmux वातावरण (या वैश्विक वातावरण) में सेट नहीं किया जाता है।

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

अगर मैं इसे मैन्युअल रूप से सेट करता हूं, तो चीजें काम करती हैं:

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

यदि मैं अलग $SSH_AUTH_SOCKहो जाता हूं और फिर से जुड़ जाता हूं, तो सेट नहीं किया जा सकता है।


यह SSH के बारे में बिल्कुल नहीं है, क्या यह है? एक नए शेल में आपके पास कौन सा पर्यावरण चर है, इसका आउटपुट क्या है env?
हॉज लैजिंग

आप मैक पर किस शेल का उपयोग कर रहे हैं? दे घुमा के?
SLM

@HaLLaging यह वास्तव में tmux के बारे में है।
क्रिस डब्ल्यू

@ एसएलएम मैं zsh का उपयोग कर रहा हूं।
क्रिस डब्ल्यू

मौजूदा खिड़कियों के बारे में क्या? क्या वे अब भी काम करते हैं?
हौके लैजिंग

जवाबों:


35

चूँकि मुझे बाउंटी प्राप्त हुआ था, इसलिए मैं पूर्णता के लिए अपनी मुख्य टिप्पणी को दूंगा - और आगंतुकों को गलत रास्ते पर एक ही समस्या से बचाने के लिए:

Tmux पर्यावरण चर को हटा देगा

Tmux का 'मैन पेज' बताता है कि अपडेट-एनवायरनमेंट वैरिएबल को हटा देगा "जो कि सोर्स इनवायरमेंट में मौजूद नहीं है [...] जैसे कि -r को सेट-एनवायरनमेंट कमांड को दिया गया है"।

जाहिर है कि इस मुद्दे का कारण क्या है। देखें नीचे 'क्रिस प्रतिक्रिया । हालांकि, मैं अभी भी कल्पना नहीं कर सकता कि चर "स्रोत वातावरण" में अनुपस्थित कैसे हो सकता है और अभी तक नव निर्मित tmux वीडियो में मान्य हो सकता है ...


पिछला उत्तर:

SSH अग्रेषण कैसे काम करता है

दूरस्थ मशीन पर, SSH कनेक्शन स्थापित करने के बाद अपने शेल के वातावरण पर एक नज़र डालें:

user@remote:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342

यहाँ एक महत्वपूर्ण SSH_AUTH_SOCK है जो वर्तमान में कुछ फ़ाइल में / tmp में सेट है। यदि आप इस फ़ाइल की जांच करते हैं, तो आप देखेंगे कि यह एक यूनिक्स डोमेन सॉकेट है - और उस ssh के विशेष उदाहरण से जुड़ा है जिसे आपने कनेक्ट किया था। महत्वपूर्ण रूप से, यह आपके द्वारा कनेक्ट होने पर हर बार बदलता है।

जैसे ही आप लॉग आउट करते हैं, वह विशेष सॉकेट फ़ाइल चली जाती है। अब, यदि आप जाते हैं और अपने tmux सत्र को फिर से पढ़ते हैं, तो आपको समस्या दिखाई देगी। इसका वातावरण तब से है जब tmux को मूल रूप से लॉन्च किया गया था - जो हफ्तों पहले हो सकता था। वह विशेष सॉकेट मृत के बाद से लंबा है।

समाधान

चूँकि हम जानते हैं कि समस्या को यह जानना है कि वर्तमान में SSH प्रमाणीकरण सॉकेट कहाँ है, तो आइए इसे एक पूर्वानुमानित स्थान पर रखें!

दूरस्थ मशीन पर अपने .bashrc या .zshrc फ़ाइल में, निम्नलिखित जोड़ें:

# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
    rm -f /tmp/ssh-agent-$USER-screen
    ln -sf $SSH_AUTH_SOCK $SOCK
    export SSH_AUTH_SOCK=$SOCK
fi

मुझे नहीं लगता कि आपको अपने tmux.conf में 'अपडेट-एनवायरनमेंट कमांड' भी डालनी होगी। मैन पेज के अनुसार , SSH_AUTH_SOCK पहले से ही डिफ़ॉल्ट रूप से कवर किया गया है।

श्रेय

मेरी प्रतिक्रिया मार्क 'xb95' स्मिथ की इस ब्लॉग पोस्ट का एक अंश है जो स्क्रीन के लिए एक ही समस्या बताती है ।


आपकी सोची समझी प्रतिक्रिया के लिए धन्यवाद। मेरा प्रश्न मेरे $SSH_AUTH_SOCKनए गोले में स्थापित करने के बारे में नहीं है , यह $SSH_AUTH_SOCK.mashrc.zshrc के स्रोत से पहले नई tmux विंडोज़ में स्थापित करने के बारे में है।
क्रिस डब्ल्यू

@ChrisW। मैंने मान लिया कि स्क्रिप्ट को आपके लॉगिन शेल की आरसी फाइल में रिमोट मशीन पर डाल दिया जाना चाहिए। यदि आप लॉगिन करते हैं, तो एक नया शेल खोल दिया जाता है, SSH_AUTH_SOCK को बदल दिया जाता है और निर्यात किया जाता है । जब आप tmux शुरू करते हैं, तो यह मूल वातावरण से SSH_AUTH_SOCK को इनहेरिट करेगा। चूंकि SSH_AUTH_SOCK का मूल्य अब तय हो गया है, इसलिए tmux को बाद के लॉगिन पर काम करते रहना चाहिए ... हो सकता है कि मैंने इस समस्या को गलत समझा हो
djf

मुझे लगता है कि मेरी उलझन उस वातावरण के बारे में है जिसमें ssh एक नई विंडो (उदाहरण tmux neww ssh somehost) के संदर्भ में tmux द्वारा चलाया जाता है ।
क्रिस डब्ल्यू

इस दृष्टिकोण के साथ एक समस्या यह है कि मशीन का दूसरा SSH कनेक्शन मान को अधिलेखित कर देगा SSH_AUTH_SOCK। यह दृष्टिकोण केवल काम करता है जबकि tmux सत्र सबसे हालिया SSH कनेक्शन के माध्यम से खुला है।
फिलाई

12

मुझे यह समझ में आया। संक्षिप्त उत्तर है, मैं दूर करने के लिए की जरूरत SSH_AUTH_SOCKसे update-environment। चूँकि यह उस सूची में था, हर बार मेरे द्वारा रिट्वीट किए जाने पर मूल्य को उड़ा दिया जा रहा था। शुक्रिया @djf क्लू के लिए। update-environmentअनुभाग में tmux (1) मैन पेज से नमकीन बिट :

कोई भी चर जो स्रोत वातावरण में मौजूद नहीं होता है, उसे सत्र वातावरण से हटा दिया जाता है (जैसे कि -r को सेट-एन्वायरमेंट कमांड को दिया गया था)।


1
@ChrisW। क्या आप कृपया थोड़ा और स्पष्ट हो सकते हैं? मुझे लगता है कि मेरे पास एक ही समस्या है: कभी-कभी एजेंट तब काम करना बंद कर देता है जब मैं tmux सत्रों को पुन: लिखता हूं। यह कुछ समझ में आता है क्योंकि SSH कनेक्शन नया है और जब मैं ssh करता हूं तो यह एक नया एजेंट शुरू करेगा। इसे काम करने के लिए मुझे क्या बदलना होगा? मुझे आशा है कि यह कुछ ऐसा है जिसे मैं चला सकता हूं क्योंकि मैं नहीं चाहता कि प्रत्येक मशीन को मैं ssh-ing में पुन: कॉन्फ़िगर करूं। - अब मेरे पास एक ssh आवरण है जो दूरस्थ रूप से tmux शुरू करता है या मौजूदा कनेक्शन को पुनर्स्थापित करता है, शायद मैं tmux को पुनर्स्थापित करने से पहले कुछ कर सकता था।
सोरिन

@ChrisW। छोटे उत्तर कभी-कभी अच्छे होते हैं, लेकिन क्या आप कृपया एक लंबा जवाब दे सकते हैं? मैं काम करने के लिए इसे पाने के लिए संघर्ष कर रहा हूं और इस पोस्ट में कुछ भी मेरे लिए काम नहीं कर रहा है।
redbmk

@sorin @redbmk इसके बारे में क्षमा करें। यह एक ही लाइन है जिसे मुझे अपने .tmux.confकाम करने के लिए बदलना पड़ा : set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" क्या आप sshसामान्य रूप से या पर्यावरण चर के साथ समस्याओं को देख रहे हैं ?
क्रिस डब्ल्यू

2

मेरे ssh- एजेंट को संभालने के लिए tmux का उपयोग करने के बजाय, मैंने इसे संभाल के साथ बैश किया है:

### SSH Agent ### {{{
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 -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
  else
    start_agent;
fi
### End SSH Agent ### }}}

मेरे पास यह मेरे ~ / bashrc में है , और यह बहुत अच्छा काम करता है।


$SSH_AUTH_SOCKमेरे गोले में ठीक से सेट है, लेकिन जब मैं कुछ ऐसा करता हूं tmux neww ssh somehost, तो मुझे अपने पासफ़्रेज़ के लिए संकेत दिया जाएगा कि मैं अपनी निजी कुंजी को अनलॉक करूं जब तक कि मैं उसे चलाऊं tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
क्रिस डब्ल्यू

1

मैंने StackOverflow https://stackoverflow.com/a/49395839/241025 पर इसी तरह के सवाल का जवाब दिया । चूंकि यह पृष्ठ मेरी Google खोजों में पहले आया था, इसलिए मैं इसका सारांश संस्करण यहां पोस्ट करना चाहता था।

कस्टम वातावरण चर का एक सेट करने के लिए प्रत्येक tmux सत्र प्राप्त करने के लिए, आपको tmux के प्रति-सत्र पर्यावरण चर में मान जोड़ना होगा। यह कैसे करना है, इसका एक उदाहरण यहां दिया गया है।

tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'

स्पष्ट रूप से निर्यात करने वाले FOO के अंतिम चरण की आवश्यकता है ताकि वर्तमान फलक पर्यावरण चर को उठा ले। इस tmux सेशन के लिए आपके द्वारा बनाया गया कोई भी बाद का पैन या विंडो FOO को इनहेरिट करेगा, लेकिन यह अन्य सत्रों में प्रदर्शित नहीं होगा।


0

djf की व्याख्या मेरे दिमाग में एक और संभावित समाधान लाती है:

पहले tmux/ screenचल रहा है:

  1. लॉग इन करें।
  2. का एक उदाहरण शुरू करें ssh-agent
  3. प्रारंभ tmux/ screenइस के लिए वातावरण चर (रों) के साथ ssh-agent

यह SSH क्लाइंट को अग्रेषित करने के लिए उपयोग नहीं कर सकता है लेकिन इसके लिए नहीं पूछा गया था।


1
ssh-agentTTY से बंधता नहीं है, इसे लॉगआउट (?) पर क्यों मारा जाना चाहिए - क्यों का उपयोग कर nohup?
poige

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