प्रति 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 उत्पादन में जोड़ा जाएगा
EOTNowdoc को समाप्त करता है, जिसके परिणामस्वरूप एक nowdoc अस्थायी फ़ाइल बनाई जा रही है और कॉलिंग catकमांड पर वापस भेज दी गई है । catNowdoc को आउटपुट करता है और आउटपुट को इंटरपोल किए गए स्ट्रिंग को कैप्चर करने के लिए वापस करता है
) निष्पादित करने के लिए आदेश समाप्त करता है
"कैप्चरिंग इंटरपोलेटेड स्ट्रिंग को समाप्त करता है। प्रक्षेपित स्ट्रिंग की सामग्री sshको एक एकल कमांड लाइन तर्क के रूप में वापस पारित किया sshजाएगा , जो दूरस्थ कमांड के रूप में निष्पादित करने के लिए व्याख्या करेगाuser@server
यदि आपको बाहरी उपकरणों का उपयोग करने से बचने की आवश्यकता है cat, और एक के बजाय दो बयानों को ध्यान में न रखें, readSSH कमांड उत्पन्न करने के लिए एक हेरेडोक के साथ अंतर्निहित का उपयोग करें :
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…