दूरस्थ ssh कमांड में वैरिएबल पास करना


99

मैं ssh का उपयोग करके अपनी मशीन से कमांड चलाने में सक्षम होना चाहता हूं और पर्यावरण चर से गुजरता हूं $BUILD_NUMBER

यहाँ मैं कोशिश कर रहा हूँ:

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'

$BUILD_NUMBER ssh कॉल करने वाली मशीन पर सेट किया गया है और चूंकि रिमोट होस्ट पर वैरिएबल मौजूद नहीं है, इसलिए इसे उठाया नहीं जाता है।

मैं का मान कैसे पास करूं $BUILD_NUMBER?


1
हडसन से असंबद्ध, टैग हटा दिया। (हडसन सिर्फ चर बनाता है)
पीटर शूएटज

जवाबों:


188

यदि तुम प्रयोग करते हो

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

के बजाय

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'

आपका शेल $BUILD_NUMBERरिमोट होस्ट को कमांड स्ट्रिंग भेजने से पहले इंटरपोल करेगा।


8
यदि कोई व्यक्ति एकल उद्धरणों का उपयोग करना चाहिए ताकि उद्धरणों में शामिल आदेश का स्थानीय रूप से मूल्यांकन न किया जाए, तो उन्हें "'$ VARIABLE' का उपयोग करना चाहिए। उदाहरण: ssh pvt@192.168.1.133 '~ / उपकरण / run_pvt.pl "' $ BUILD_NUMBER '" "
dr.doom

3
नहीं पता था कि बैश सिंगल कोट्स और डबल कोट्स के साथ अलग तरह से प्रतिक्रिया करता है। धन्यवाद!
सिलगॉन

1
linux core Developers को नरक में जलाना चाहिए
Goldstar

@goldstar, ध्यान दें कि शेल में एकल उद्धरण और दोहरे उद्धरण व्यवहार के बीच का अंतर दशकों से लिनक्स से पहले का है।
सितंबर को

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

27

एकल-उद्धरणों में चर का मूल्यांकन नहीं किया जाता है। दोहरे उद्धरण चिह्नों का उपयोग करें:

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

शेल दोहरे-उद्धरणों में चर का विस्तार करेगा, लेकिन एकल-उद्धरण में नहीं। sshकमांड में भेजे जाने से पहले यह आपके वांछित स्ट्रिंग में बदल जाएगा ।


2

(यह उत्तर अनावश्यक रूप से जटिल लग सकता है, लेकिन व्हॉट्सएप और विशेष पात्रों के बारे में यह आसानी से एक्स्टेंसिबल और मजबूत है, जहां तक ​​मुझे पता है।)

आप sshकमांड के मानक इनपुट के माध्यम readसे और दूरस्थ स्थान से डेटा को सही तरीके से फीड कर सकते हैं ।

निम्नलिखित उदाहरण में,

  1. उन अनुक्रमों के नामों के साथ एक अनुक्रमित सरणी भरी जाती है (सुविधा के लिए) जिनके मूल्य आप दूरस्थ रूप से प्राप्त करना चाहते हैं।
  2. उन चर में से प्रत्येक के लिए, हम देते हैं ssh एक शून्य-समाप्त लाइन देते हैं, जो चर का नाम और मूल्य देता है।
  3. में shhआदेश अपने आप में, हम इन पंक्तियों के माध्यम से लूप आवश्यक चर आरंभ करने के लिए।
# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb

# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
    FOO
    BAR
)

for name in "${VAR_NAMES[@]}"
do
    printf '%s %s\0' "$name" "${!name}"
done | ssh user@somehost.com '
    while read -rd '"''"' name value
    do
        export "$name"="$value"
    done

    # Check
    printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'

आउटपुट:

FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]

यदि आपको exportउन की आवश्यकता नहीं है , तो आपको declareइसके बजाय उपयोग करने में सक्षम होना चाहिए export

एक वास्तव में सरलीकृत संस्करण की तरह लग रहे हैं (यदि आप तानाना की जरूरत नहीं है, प्रक्रिया, आदि के लिए एक एकल चर है):

$ ssh user@somehost.com 'read foo' <<< "$foo"

2

डिफ़ॉल्ट रूप से SSHD पर स्वीकृत पर्यावरण चर की सूची में शामिल हैं LC_*। इस प्रकार:

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3

0

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

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'

यदि आप वास्तव में पर्यावरण होस्ट को दूरस्थ होस्ट पर सेट करना चाहते हैं और इसका उपयोग करना चाहते हैं, तो आप envप्रोग्राम का उपयोग कर सकते हैं

ssh pvt@192.168.1.133 "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"

इस मामले में यह एक ओवरकिल, और नोट का एक सा है

  • env BUILD_NUMBER=$BUILD_NUMBER स्थानीय होस्ट पर मेटा विस्तार करता है
  • दूरस्थ BUILD_NUMBERवातावरण चर का उपयोग
    दूरस्थ शेल द्वारा किया जाएगा

0

स्पष्ट रूप से ssh के माध्यम से पर्यावरण चर को पास करना भी संभव है। इसके माध्यम से कुछ सर्वर-साइड सेट-अप की आवश्यकता होती है, इसलिए यह एक सार्वभौमिक उत्तर नहीं है।

मेरे मामले में, मैं बैकअप स्टोरेज सर्वर पर कमांड के लिए एक बैकअप रिपॉजिटरी एन्क्रिप्शन कुंजी को पास करना चाहता था, उस कुंजी को वहां संग्रहीत किए बिना, लेकिन ध्यान दें कि किसी भी पर्यावरण चर में दिखाई दे रहा है ps ! स्टड पर कुंजी को पारित करने का समाधान भी काम करेगा, लेकिन मैंने इसे बहुत बोझिल पाया। किसी भी स्थिति में, ssh के माध्यम से पर्यावरण चर को कैसे पार किया जाए:

सर्वर पर, sshd_configफ़ाइल को संपादित करें , आम तौर पर /etc/ssh/sshd_configऔर AcceptEnvउन चर से मेल खाता एक निर्देश जोड़ें जो आप पास करना चाहते हैं। देखते हैं man sshd_config। मेरे मामले में, मैं बोर्ग बैकअप के लिए चर पास करना चाहता हूं, इसलिए मैंने चुना:

AcceptEnv BORG_*

अब, क्लाइंट पर -o SendEnvपर्यावरण चर भेजने के लिए विकल्प का उपयोग करें । निम्न कमांड लाइन पर्यावरण चर को सेट करती है BORG_SECRETऔर फिर इसे ग्राहक मशीन (जिसे कहा जाता है backup) में भेजा जाना है । यह तब printenvवहां चलता है और BORG चर के लिए आउटपुट को फ़िल्टर करता है:

$ BORG_SECRET=magic-happens ssh -o SendEnv=BORG_SECRET backup printenv | egrep BORG
BORG_SECRET=magic-happens

आप डिफ़ॉल्ट सर्वर साइड सेटिंग्स का उपयोग करके अपने चर को "स्मगल" कर सकते हैं, मेरा उत्तर देखें । सार यह है कि डिफ़ॉल्ट ओपनएसएसएचडी विन्यास में LC_*वैरिएबल्स को भेजने की अनुमति के रूप में शामिल है , इसलिए बस उपयोग करें $LC_TvE_foo, या $LC_BORG_SECRET, सुनिश्चित करें कि आप बिल्ट-इन चर के साथ "टकराना" नहीं चाहते हैं।
एलेक्स स्ट्रैजी

-2

चर सत्र से बाहर चर का उपयोग करने के लिए चर से बच: ssh pvt@192.168.1.133 "~ / tools / myScript.pl \ $ BUILD_NUMBER"


2
इससे वह हासिल नहीं होता जो सवाल पूछ रहा है।
पैट्रिक ट्रेंटिन

2
शेल के दृष्टिकोण से, '$FOO'के बराबर है "\$FOO"। सवाल था "SSH के साथ एक शेल चर कैसे पारित किया जाए?"। जैसा कि @PatrickTrentin ने पहले ही कहा था कि यह सही उत्तर नहीं है क्योंकि तब BUILD_NUMBERपर्यावरण चर को दूरस्थ रूप से सेट नहीं किया जाता है।
गाइल्स गोइलार्डेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.