जब ssh'ing, मैं सत्र से सत्र में परिवर्तन करने वाले सर्वर पर एक पर्यावरण चर कैसे सेट कर सकता हूं?


92

जब मैं sshएक सर्वर में होता हूं, तो मैं क्लाइंट से सर्वर में एक पर्यावरण चर कैसे पारित कर सकता हूं? यह पर्यावरण चर परिवर्तन ssh के विभिन्न आह्वानों के बीच होता है, इसलिए मैं $HOME/.ssh2/environmentहर बार जब मैं ssh कॉल करता हूं, तब इसे अधिलेखित नहीं करना चाहता । मैं यह कैसे कर सकता हूँ?


2
आप प्रश्न एक विशिष्ट अधिक विशिष्ट होना चाहिए।
इग्नासियो वाज़केज़-अब्राम्स

3
प्रश्न मेरे लिए पर्याप्त स्पष्ट था। हालाँकि, sshमैन पेज से, जब तक आप सर्वर में लॉग इन नहीं करते, तब तक मैं वैरिएबल सेट करने के अलावा कोई अन्य तरीका नहीं देखता, जब तक कि आप ~ / .shsh2 / वातावरण को संशोधित नहीं करते।
गैरीजोन

क्या यह हर बार एक अलग चर है? या एक अलग मूल्य?
डेनिस विलियमसन


1
अन्य तरह से गोल, क्योंकि यह पहले से ही अधिक लोकप्रिय है। इससे कोई फर्क नहीं पड़ता कि यह पुराना है।
kenorb

जवाबों:


110

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

आप एक चर यह ग्राहक पर है कि सर्वर पर एक ही मूल्य प्राप्त करना चाहते हैं, कोशिश SendEnvविकल्प:

ssh -o SendEnv = MYVAR server.example.com mycommand

हालांकि, इसे सर्वर से समर्थन की आवश्यकता होती है। OpenSSH के साथ, चर नाम को अधिकृत करना होगा /etc/sshd_config

यदि सर्वर केवल कुछ विशिष्ट चर नामों की अनुमति देता है, तो आप उसके आसपास काम कर सकते हैं; उदाहरण के लिए एक सामान्य सेटअप के LC_*माध्यम से अनुमति देता है, और आप निम्न कार्य कर सकते हैं:

ssh -o SendEnv = LC_MYVAR server.example.com 'MYVAR = $ LC_MYVAR; unset LC_MYVAR; निर्यात MYVAR; mycommand '

यदि LC_*कोई विकल्प नहीं भी है, तो आप TERMपर्यावरण चर में जानकारी पास कर सकते हैं , जो हमेशा कॉपी की जाती है (हालांकि एक लंबाई सीमा हो सकती है)। आपको अभी भी यह सुनिश्चित करना होगा कि दूरस्थ शेल TERMकिसी ज्ञात टर्मिनल प्रकार को नामित करने के लिए चर को प्रतिबंधित नहीं करता है । -tयदि आप एक दूरस्थ संवादात्मक खोल शुरू नहीं कर रहे हैं, तो ssh के विकल्प को पास करें ।

env TERM = "अतिरिक्त जानकारी: $ TERM" ssh -t server.example.com 'MYVAR = $ {TERM%: *}; अवधि = $ {अवधि ## *:}; निर्यात MYVAR; mycommand '

एक और संभावना है कि चर को सीधे कमांड में परिभाषित किया जाए:

ssh -t server.example.com 'निर्यात MYVAR = "अतिरिक्त जानकारी"; mycommand '

इस प्रकार, यदि कोई स्थानीय चर पास कर रहा है:

ssh -t server.example.com 'निर्यात MYVAR =' '' $ LOCALVAR '' ''; mycommand '

हालांकि, मुद्दों को उद्धृत करने से सावधान रहें: चर के मूल्य को सीधे रिमोट साइड पर निष्पादित शेल स्निपेट में इंटरपोल किया जाएगा। ऊपर दिए गए अंतिम उदाहरण में मान लिया गया है कि $LOCALVARकोई एकल उद्धरण ( ') नहीं है।


2
बहुत धन्यवाद, मैं गुस्से में था कि बेवकूफ LC_ * चर ssh पर निर्यात किए जाते हैं और आपके जवाब ने मुझे निर्देशित किया कि मुझे कहां देखना है। मुझे बस इसे ~ /
.ssh

1
मैं मूल पोस्टर की स्थिति में हूं, लेकिन जो चर मैं अग्रेषित करना चाहता था वह TERM है, इसलिए मैं आपके उत्तर से थोड़ा हैरान हूं। क्या TERM की यह स्वचालित अग्रेषण हाल ही में ओपनएसएसएच संस्करणों द्वारा अक्षम की गई है?
डाउ

1
@ संदेह व्यवस्थापक द्वारा वांछित AcceptEnvनिर्देशों के साथ, सर्वर साइड पर सभी पर्यावरण चर को अस्वीकार करने के लिए डिफ़ॉल्ट है sshd_config। लेकिन TERMविशेष रूप से व्यवहार किया जाता है, जहां तक ​​मुझे पता है कि सर्वर साइड पर इसे फ़िल्टर करने का कोई तरीका नहीं है (यह किसी भी कॉन्फ़िगरेशन सेटिंग की परवाह किए बिना शेल के वातावरण में सेट है)। तुम वहाँ यह अधिभावी एक प्रोफ़ाइल लिपि (जैसे नहीं है यकीन है /etc/profileया ~/.profileया ~/.bashrc)?
गिल्स

2
@ गिल्स: मैंने इसे फिर से परीक्षण किया, और जब तक मैं स्पष्ट रूप से अपने एक्सेप्टिव निर्देश में टीईआरएम को जोड़ नहीं देता, तब तक टीईआरएम पारित नहीं होता। मैं एक खोल नहीं खोल रहा हूं, लेकिन सीधे एक कमांड चला रहा हूं, उदाहरण के लिए: "ssh -o SendEnv = TERM shell.example.com env"। यह सभी पर्यावरण चर को प्रिंट करता है, और TERM केवल तभी दिखाई देता है जब यह क्लाइंट पर SendEnv और सर्वर पर AcceptEnv हो। यदि मैं "ssh -o SendEnv = TERM shell.example.com echo \ $ {TERM}" को स्वीकार करता हूँ, तो AcceptEnv या SendEnv को छोड़ देता हूँ, यह "dumb" प्रिंट करता है, जो मुझे यकीन नहीं है कि कहाँ से आता है (env भी नहीं) उस मामले में सूची)।
Doub

7
@ ओह, मैं देख रहा हूँ। TERMयदि ग्राहक सर्वर से एक टेट आवंटित करने का अनुरोध करता है, तो यह केवल प्रसारित होता है। यदि रिमोट की तरफ कोई टर्मिनल नहीं है, तो इसे प्रसारित करना बेकार होगा TERM। जब आप एक कमांड निर्दिष्ट करते हैं, यदि आप रिमोट की तरफ टर्मिनल रखना चाहते हैं, तो आपको -tकमांड लाइन विकल्प (या RequestTTYइन ~/.ssh/config) की आवश्यकता है।
गिलेस

12

यदि आप लक्ष्य होस्ट को प्रशासित कर सकते हैं तो आप अपने स्थानीय पर्यावरण चर को लक्ष्य होस्ट के साथ पारित करने की अनुमति देने के लिए sshd कॉन्फ़िगर कर सकते हैं।

Sshd_config मैन पेज से:

 PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd.  The default is
     "no".  Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

sshd कॉन्फ़िगरेशन आमतौर पर रहता है /etc/ssh/sshd_config


7
यह जानना बहुत उपयोगी है कि यह डिफ़ॉल्ट रूप से "नहीं" पर सेट है!
देशभक्ति

6

तो, अपने क्लाइंट पर, आपके पास कुछ पर्यावरण चर है, और आप चाहते हैं कि दूरस्थ कमांड के लिए उपलब्ध हो? मुझे नहीं लगता कि ssh जादुई तरीके से इसे पास करने का एक तरीका है, लेकिन आप शायद ऐसा कुछ कर सकते हैं। उपयोग करने के बजाय, यह कहें:

ssh remote.host my_command

तुम यह केर सकते हो:

ssh remote.host env ENV_VAR=$ENV_VAR my_command

"शायद"? काश, मैं वास्तव में इस उत्तर को आजमाने से पहले पढ़ता। मेरे लिए काम नहीं किया।
23

1
प्राप्त की गई किसी भी त्रुटि आदि के बारे में विस्तार से ध्यान रखें?
पीटो

1
@pioto को उद्धृत किया जा सकता है, उदाहरण के लिए यदि ENV_VAR में रिक्त स्थान हैं
मार्टिन सी। मार्टिन

मैक पर आपको एक इंटरेक्टिव संस्करण के लिए -t विकल्प रखना होगा, अन्यथा यह अटक जाता है। तो यह काम कर सकता है: $ ssh -t Remote.host env ENV_VAR = $ ENV_VAR my_command
muenalan

3

@ emptyset की प्रतिक्रिया (जो मेरे लिए काम नहीं आई) ने मुझे इस उत्तर की ओर अग्रसर किया:

आप इस कमांड को अपनी ~/.ssh/authorized_keysफाइल में जोड़ सकते हैं :

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something>तुरंत बाहर निकल रहा था, और SSH कनेक्शन को बंद कर दिया गया था (मुझे सर्वर से लॉक कर रहा था), जबकि /usr/bin/env ... $SHELLएक संशोधित वातावरण के साथ आपका डिफ़ॉल्ट शेल चलेगा।


मेरे लिए लॉग इन करते समय यह लटका रहता है। जब मैं इसे हटाता हूं तो SSH सामान्य पर लौटता है और मुझे अपना सामान्य लॉगिन शेल मिलता है।
निक स्वीटिंग

@NickSweeting क्या आपने शायद $SHELLवास्तविक शेल के साथ बदलने की कोशिश की है ? यह भी जांचें कि सर्वर पर / usr / bin / env मौजूद है। हालांकि समाधान सही नहीं है: मैंने देखा है कि जब मैं scpइनलाइन कमांड का उपयोग करना चाहता था तो यह लटका हुआ था ।
madprog

हां, मैंने पहली कोशिश की थी। दुर्भाग्य से इसे काम करने के लिए कभी नहीं मिला, इसके बजाय सक्षम PermitUserEnvironment yesऔर उपयोग environment="..."करना समाप्त कर दिया command="..."
निक स्वीटिंग

यह मेरे लिए अच्छा काम कर रहा है।
श्री ताओ

2

अपने स्थानीय क्लाइंट पर, अपने में ~/.ssh/configआप जोड़ सकते हैं SetEnv, जैसे

Host myhost
  SetEnv FOO=bar

नोट: जाँच करें man ssh_config

फिर सर्वर पर, क्लाइंट को अपनी /etc/ssh/sshd_configकॉन्फिगर फाइल में कुछ निश्चित पर्यावरण चर पास करने की अनुमति देना सुनिश्चित करें :

AcceptEnv LANG LC_* FOO BAR*

नोट: जाँच करें man sshd_config


1

आप पासवर्ड-कम ssh लॉगिन सेटअप मानकर एक कस्टम कमांड को लागू करने का प्रयास कर सकते हैं। सर्वर पर, अपने ~ / .ssh / अधिकृत_की प्रविष्टि को संपादित करें जो आपके क्लाइंट से कुंजी से मेल खाती है:

command="export VARIABLE=<something>" ssh-rsa <key>

देखो इस लिंक खंड में कमान मजबूर थोड़ा और विस्तार के लिए।


1
मैंने यह कोशिश की, लेकिन यह काम नहीं करता है। यह कमांड चलाता है और बाहर निकलता है, इसलिए कोई इंटरैक्टिव सत्र नहीं है। क्या वह सामान्य व्यवहार है? यदि ऐसा है, तो यह उपयोगी हो सकता है यदि आप सभी करना चाहते हैं तो एक विशिष्ट कमांड को ट्रिगर करने के लिए एक विशिष्ट कुंजी की अनुमति है, लेकिन यदि आप एक सत्र में उपयोग की जाने वाली जानकारी (प्रश्न के रूप में) पास करना चाहते हैं तो यह उस उद्देश्य के लिए बेकार है । वहाँ कोई सत्र नहीं है।
iconoclast

1

मैं होम डायरेक्टरी और / etc (Cram FS केवल-पढ़ने के लिए) में cramfs के साथ एक डिवाइस के लिए OpenSSH का एक कस्टम निर्माण कर रहा था, इसलिए ~ /। Ssh / पर्यावरण पूरे FS के पुनर्निर्माण के बिना काम नहीं करेगा और ये फील्ड फीक्ड थे। उपकरण (एंबेडेड सिस्टम इसलिए CRAMFS का उपयोग)। आप कर सकते हैं निर्दिष्ट sshd_config के स्थान को ऑर्किडाइज़्ड_कीज़ फ़ाइल में लेकिन किसी कारण से पर्यावरण = केवल ~ / .shsh / ऑवरोज़ाइज्ड_की में पर्यावरण चर के लिए काम करते हैं। / Etc / प्रोफाइल का संपादन एक विकल्प नहीं था और मुझे एक गैर-मानक निर्देशिका में ssh लोड करना था। Session.c में child_set_env (... "MAIL" ...) के बाद केवल आपके द्वारा आवश्यक एनवायरमेंट वैरिएबल जोड़ें (यह एक हैक मुझे पता है ...) लेकिन बस इंसेप्शन किसी को सत्र के लिए कुछ हार्डकोड envs की जरूरत है यदि आप स्रोत से संकलन आप ऐसा कर सकते हैं। TGI-सोता


0

सिर्फ एक साधारण आदेश:

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