मैं ssh कमांड के माध्यम से पर्यावरण चर कैसे पार कर सकता हूं? [डुप्लिकेट]


42

मैं एक ssh कमांड में एक मान कैसे पारित कर सकता हूं, जैसे कि मेजबान मशीन पर शुरू होने वाला वातावरण मेरे चयन के लिए एक निश्चित पर्यावरण चर के साथ शुरू होता है?

संपादित करें: लक्ष्य वर्तमान kde डेस्कटॉप (dcop kwin KWinInterface currentDesktop से) को नए शेल में बनाया गया है ताकि मैं अपने JEdit इंस्टेंस पर मूल nfs स्थानों को वापस कर सकूं जो प्रत्येक KDE डेस्कटॉप के लिए अद्वितीय है। ( Emacsserver / emacsclient जैसे तंत्र का उपयोग करके )

Ssh उदाहरणों को कई बार एक बार में उड़ान भरने का कारण हो सकता है क्योंकि जब मैं अपना वातावरण सेट कर रहा होता हूं, तो मैं अलग-अलग मशीनों के लिए अलग ssh इंस्टेंस का एक गुच्छा खोल रहा हूं।

जवाबों:


17

~/.ssh/environmentफ़ाइल सेट चर आप दूरस्थ आदेश के लिए उपलब्ध चाहते हैं के लिए इस्तेमाल किया जा सकता है। आपको PermitUserEnvironmentsshd कॉन्फ़िगरेशन में सक्षम करना होगा ।

चर सेट इस तरह से बच्चे प्रक्रियाओं के लिए निर्यात कर रहे हैं, तो आप कर सकते हैं:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

और myscript को पता चलेगा कि फू बार है और जो 37 है।


3
चर को संभावित रूप से हर ssh कॉल को बदलने की जरूरत है
रॉस रोजर्स

1
यह बताने के लिए बेहतर हो सकता है कि आप क्या करने की कोशिश कर रहे हैं और क्यों। अन्य उपाय हो सकते हैं। पर्यावरण फ़ाइल को प्रत्येक ssh कॉल पर गतिशील रूप से उत्पन्न करना होगा, जो असंभव नहीं है।
EmmEff

क्या बदलने वाला है? उन चरों के मान या उनके नाम भी?
innaM

रफ़ू। मैंने इस समाधान की कोशिश की, लेकिन मेरे पास sshd config फाइल नहीं है और ~ / .ssh / या ~ / .ssh2 / वातावरण में var डालने से काम नहीं चलता। मुझे लगता है कि मैं एक कूडल का उपयोग करने जा रहा हूं, जहां मैं इस चर को nfs डिस्क पर छोड़ता हूं और फिर इसे मेरी ~ / .tcsh सेटअप फ़ाइल तक स्नार्फ़ करता हूं।
रॉस रोजर्स

2
यह उत्तर वास्तव में प्रश्न का उत्तर नहीं देता है।
intuited

55

SendEnvविकल्प आपके आदमी है।

~ /। ssh / config: (स्थानीय रूप से)

SendEnv MYVAR

/ etc / ssh / sshd_config: (दूरस्थ अंत पर)

AcceptEnv MYVAR

अब, जो कुछ भी $MYVARस्थानीय स्तर पर है, वह दूरस्थ सत्र में भी उपलब्ध है।
यदि आप कई बार लॉगिन करते हैं, तो $MYVARसंभवतः प्रत्येक सत्र की अपनी प्रति होगी , जिसमें संभवतः अलग-अलग मूल्य होंगे।

~/.ssh/environmentअन्य उद्देश्यों के लिए है। यह गैर-शेल कमांड को दूरस्थ रूप से $ENVनिष्पादित करते समय फ़ाइल के रूप में कार्य करता है ।


6
कमांड लाइन के माध्यम से भी (अधिक उपयोगी तरीके से) पारित किया जा सकता है ssh myserver -o SendEnv="MYVAR", ताकि आप इसे स्क्रिप्ट में गतिशील बना सकें।
माइक कैंपबेल

31

आप निम्न के समान कमांड के साथ मान पास कर सकते हैं:

ssh username@machine VAR=value cmd cmdargs

आप इसके साथ परीक्षण कर सकते हैं:

ssh machine VAR=hello env

निम्नलिखित कार्य करने के लिए tcsh पर:

ssh machine "setenv VAR <value>; printenv"

ऐसा लगता है कि बैश वातावरण के लिए अच्छी तरह से काम करता है। बहुत बुरा मैं एक कॉर्पोरेट tsh वातावरण में हूँ।
रॉस रोजर्स

2
मैं अंतःक्रियात्मक रूप से सत्र का उपयोग कैसे कर सकता हूं?
भाग्योदयकाल

1
ध्यान दें कि पहला उदाहरण केवल पहले कमांड के लिए काम करता है यदि आप कमांड (साथ &&) का पीछा कर रहे हैं । export VAR=value;तीसरे रूप में सेटेनव के बजाय बैश का उपयोग करना इस मामले के लिए काम करता है।
कंट्रेबिस

2
यह वही है जो मैंने किया! आप जहां भी जाएं, अपने पर्यावरण को अपने साथ ले जाएं। आपका ऐसा कर सकते हैं ssh user@host "$(<env_to_source.sh) command ..." :। Env to source में, मेरी export var=value ; अलग-अलग लाइनें हैं (अर्धविराम को याद रखें)।
टॉमस गैंडर

@TomaszGandor: वर्षों बाद, अभी भी एकदम सही - मुझे PROMPT_COMMAND जैसे जटिल सामान भी पास करने की अनुमति देता है w से बचने के बारे में चिंता करने की आवश्यकता w / o :-) 1000 धन्यवाद।
लाल गोली

29

एक भयानक, भयानक हैक भी है।

यदि आपकी स्क्रिप्ट दूरस्थ छोर पर चर का उपभोग कर रही है (यानी आप जो चाहें उसे नाम दे सकते हैं), तो आप स्थानीय चर का दुरुपयोग कर सकते हैं। फॉर्म LC_ * के किसी भी वेरिएबल को वर्बेटिम पर पास किया जाएगा, जिसमें कॉन्फ़िगरेशन की कोई आवश्यकता नहीं होगी।

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

मूल रूप से, यदि LC_BOUNCE_HOSTS सेट किया जाता है, तो यह इसे पहले होस्ट से रिक्त स्थान और छिलके पर विभाजित करता है। फिर यह उसी स्क्रिप्ट को उछालता है और चलाता है। गंतव्य नोड पर, यह सूची अंततः खाली है, इसलिए यह कमांड चलाता है। मेरे पास एक डीबग मोड भी है (जो नेटवर्क की परेशानी के दौरान बहुत अच्छा है), जिसे LC_BOUNCE_DEBUG द्वारा सेट किया गया है। चूँकि ssh जादुई रूप से मेरे लिए इन सब से गुजरता है, मुझे मेजबान सूची के अंत को पहचानने के अलावा कुछ नहीं करना है (जो मैं एक विकल्प के साथ करता हूँ)।

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


2
आप OpenSSH के अंतर्निहित ProxyCommandविकल्प के बजाय ऐसा कुछ क्यों इस्तेमाल करेंगे ? अपना संपादित करें ~/.ssh/configऔर जैसे कोई ब्लॉक जोड़ें Host *.example.com: ProxyCommand -ssh -W %h:%p bastionhostऔर इसे अपने कनेक्शन को आपके लिए टनल दें।
किर्क स्ट्रैसर

1
सुरंगों के लिए, यह इतना बुरा नहीं है। Env vars के लिए, दो कारण: एक, PermitUserEnvironment को उन्हें सीधे पास करने के लिए सर्वर पर कॉन्फ़िगर करने के लिए एडमिन एक्सेस की आवश्यकता होती है। कमांड लाइन के माध्यम से उन्हें पास करना भी भागने के अधिकार को पाने के लिए वास्तव में कठिन है। दो, कई गढ़ों के माध्यम से बाउंस किया जाना चाहिए, जिससे यह थोड़ा अधिक जटिल हो जाता है - खासकर जब यह स्रोत होस्ट से स्पष्ट नहीं होता है कि एक निश्चित गंतव्य होस्ट के लिए कौन सा पथ लेना है। यह कहना आसान है: "ssh-config फ़ाइलों की एक श्रृंखला में मेजबानों की बढ़ती आबादी के लिए मार्गों को बनाए रखने की तुलना में" bounce-ssh bast1 bast2 नोडएक्स - rm -rf / "।
जेसन

अच्छी पकड़ !! इतना शानदार और थोड़ा गंदा !!
zw963

2
यह भयानक है। वाहवाही। 👏
पाई Delport

1
यह बहुत बढ़िया है, धन्यवाद! मैं इसे एक और बहुत अच्छा हैक के लिए इस्तेमाल किया है ! :)
लुम्ब्रिक

1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

बैश पर मैंने साथ परीक्षण किया:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.