प्रति zanco का जवाब है, तो आप के लिए एक दूरस्थ कमांड प्रदान नहीं कर रहे ssh
, यह देखते हुए कि कैसे शेल कमांड लाइन पार्स करता है। इस समस्या को हल करने के लिए, अपने ssh
कमांड इनवोकेशन के सिंटैक्स को बदलें ताकि रिमोट कमांड सिंटैक्टिकली सही, मल्टी-लाइन स्ट्रिंग से युक्त हो।
विभिन्न प्रकार के वाक्यविन्यास हैं जिनका उपयोग किया जा सकता है। उदाहरण के लिए, चूंकि कमांडों को पाइप किया जा सकता है bash
और sh
, और शायद अन्य गोले भी, सरलतम उपाय यह है कि ssh
शेल इनवोकेशन को केवल हेरेडोक्स के साथ संयोजित करें:
ssh user@server /bin/bash <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
ध्यान दें कि उपरोक्त को बिना निष्पादित किए/bin/bash
चेतावनी में परिणाम होगा Pseudo-terminal will not be allocated because stdin is not a terminal
। यह भी ध्यान दें कि EOT
सिंगल-कोट्स से घिरा हुआ है, जिससे कि हर्डोक को अबडॉक केbash
रूप में पहचाना जाता है , स्थानीय चर प्रक्षेप को बंद कर दिया जाता है ताकि कमांड टेक्स्ट को जैसे-जैसे पास किया जाएगा ssh
।
यदि आप पाइप के प्रशंसक हैं, तो आप निम्नानुसार फिर से लिख सकते हैं:
cat <<'EOT' | ssh user@server /bin/bash
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
/bin/bash
ऊपर के बारे में एक ही चेतावनी लागू होती है।
एक अन्य मान्य तरीका है, मल्टी-लाइन रिमोट कमांड को एक स्ट्रिंग के रूप में पास करना, जो कि bash
वेरिएबल इंटरपोलेशन की कई परतों का उपयोग करता है:
ssh user@server "$( cat <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
)"
उपरोक्त समाधान निम्नलिखित तरीके से इस समस्या को हल करता है:
ssh user@server
बैश द्वारा पार्स किया गया है, और होने की व्याख्या की है ssh
आदेश, उसके बाद एक तर्क user@server
को पास करने की ssh
कमान
"
एक प्रक्षेपित स्ट्रिंग शुरू करता है, जिसे पूरा करने पर ssh
कमांड में पारित करने के लिए एक तर्क शामिल होगा , जिसे इस मामले में व्याख्या ssh
करने के लिए दूरस्थ कमांड के रूप में समझा जाएगाuser@server
$(
निष्पादित होने के लिए एक कमांड शुरू करता है, जिसमें आउटपुट आसपास के प्रक्षेपित स्ट्रिंग द्वारा कब्जा कर लिया जाता है
cat
जो कुछ भी फाइल है उसकी सामग्री को आउटपुट करने के लिए एक कमांड है। के उत्पादन को cat
वापस प्रक्षेपित स्ट्रिंग में कैप्चर किया जाएगा
<<
एक बैश वंशानुगत शुरू होता है
'EOT'
निर्दिष्ट करता है कि हेरेडोक का नाम ईओटी है। '
ईओटी के आस-पास के एकल उद्धरण निर्दिष्ट करते हैं कि हेरेडोक को अबडॉक के रूप में पार्स किया जाना चाहिए , जो हेरेडोक का एक विशेष रूप है जिसमें सामग्री को बैश द्वारा प्रक्षेपित नहीं किया जाता है, बल्कि शाब्दिक प्रारूप में पारित किया जाता है
किसी भी सामग्री के बीच में सामना किया है <<'EOT'
और <newline>EOT<newline>
nowdoc उत्पादन में जोड़ा जाएगा
EOT
Nowdoc को समाप्त करता है, जिसके परिणामस्वरूप एक nowdoc अस्थायी फ़ाइल बनाई जा रही है और कॉलिंग cat
कमांड पर वापस भेज दी गई है । cat
Nowdoc को आउटपुट करता है और आउटपुट को इंटरपोल किए गए स्ट्रिंग को कैप्चर करने के लिए वापस करता है
)
निष्पादित करने के लिए आदेश समाप्त करता है
"
कैप्चरिंग इंटरपोलेटेड स्ट्रिंग को समाप्त करता है। प्रक्षेपित स्ट्रिंग की सामग्री ssh
को एक एकल कमांड लाइन तर्क के रूप में वापस पारित किया ssh
जाएगा , जो दूरस्थ कमांड के रूप में निष्पादित करने के लिए व्याख्या करेगाuser@server
यदि आपको बाहरी उपकरणों का उपयोग करने से बचने की आवश्यकता है cat
, और एक के बजाय दो बयानों को ध्यान में न रखें, read
SSH कमांड उत्पन्न करने के लिए एक हेरेडोक के साथ अंतर्निहित का उपयोग करें :
IFS='' read -r -d '' SSH_COMMAND <<'EOT'
echo "These commands will be run on: $( uname -a )"
echo "They are executed by: $( whoami )"
EOT
ssh user@server "${SSH_COMMAND}"
ssh user@server /bin/bash <<EOT…