2013-03-06 2 views
6

मैं रिमोट मशीन पर अनुक्रम में कई कमांड निष्पादित करना चाहता हूं, और बाद के कुछ आदेश पहले के लोगों पर निर्भर करते हैं। , क्या मैं वास्तव में क्या करना चाहते हैं टुकड़ा एक साथ एक रास्ता है पृष्ठभूमि जानकारी का एक सा के लिएक्या दूरस्थ ssh कमांड में चर का उपयोग करना संभव है?

ssh my_server "echo this is my_server; abc=2;" 
this is my_server 
abc=2: Command not found. 
ssh my_server "echo this is my_server; abc=2; echo abc is $abc" 
abc: undefined variable 

और एक जावा आवेदन शुरू: सरल संभव उदाहरण में मैं इस मिल

ssh my_server 'nohup sh -c "((echo this is my_server; jabref_exe=`which jabref`; jabref_dir=`dirname $jabref_exe`; java -jar $jabref_dir/../jabref.jar` $1 &/dev/null) &)"' & 
jabref_dir: Undefined variable. 

इस तरह, जब भी jabref सर्वर पर किसी नए संस्करण में अपडेट हो जाता है, तो मुझे जार फ़ाइल के पथ को मैन्युअल रूप से अपडेट नहीं करना पड़ेगा। Jabref निष्पादन योग्य तर्क नहीं लेता है, लेकिन इसे java -jar के साथ लॉन्च करता है, यही कारण है कि मुझे पथ को थोड़ा सा जोड़ना है।

फिलहाल मैं एक अलग स्क्रिप्ट फ़ाइल में कमांड की सूची है और फोन

ssh my_server 'nohup sh -c "((my_script.sh &/dev/null) &)"' & 

जो काम करता है, लेकिन सब कुछ एक साथ है करने के लिए के बाद से ssh कॉल एक स्क्रिप्ट फ़ाइल के अंदर पहले से ही है यह अच्छा होगा।

उत्तर

6

चेपर से कुछ प्रेरणा के साथ, अब मेरे पास एक समाधान है जो काम करता है, लेकिन केवल जब बैश खोल या बैश स्क्रिप्ट से बुलाया जाता है। यह tcsh से काम नहीं करता है।

#!/bin/bash 
if [ -f "$1" ] 
then 
    fname_start=$(echo ${1:0:4}) 
    if [ "$fname_start" = "/tmp" ] 
    then 
     scp $1 my_server:$1 
     ssh my_server "bash -c 'source load_module jdk; source load_module jabref; java_exe=\$(which java); jabref_exe=\$(which jabref); jabref_dir=\$(echo \${jabref_exe%/bin/jabref});eval \$(java -jar \$jabref_dir/jabref.jar $1)'" & 
    else 
     echo input argument must be a file in /tmp. 
else 
    echo this function requires 1 argument 
fi 
:

ssh my_server "bash -c 'echo this is \$HOSTNAME; abc=2; echo abc is \$abc;'" 

इस के आधार पर, नीचे दिए गए कोड है जो एक दूरस्थ सर्वर पर jabref चलाता है (हालांकि एक्स-अग्रेषण डिफ़ॉल्ट और passwordless प्रमाणीकरण द्वारा के साथ उपयोगकर्ता यह नहीं बता सकता दूरस्थ है) एक स्थानीय स्क्रिप्ट है

और यह 1-लाइन स्क्रिप्ट load_module है, क्योंकि मॉड्यूलसीएमडी पर्यावरण चर सेट करता है और मैं यह नहीं समझ सकता कि स्क्रिप्ट को सोर्स किए बिना इसे कैसे किया जाए।

eval `/path/to/modulecmd bash load $1`; 

मैं भी heredocs को देखा, How to use SSH to run a shell script on a remote machine? और http://tldp.org/LDP/abs/html/here-docs.html से प्रेरित है। अच्छा हिस्सा यह है कि यह tcsh से भी काम करता है। मुझे यह कमांड लाइन से काम मिल गया, लेकिन एक स्क्रिप्ट के अंदर नहीं। यह ठीक करने के लिए काफी आसान है, लेकिन मुझे अब समाधान मिला है इसलिए मैं खुश हूं :-)

ssh my_server 'bash -s' << EOF 
echo this is \$HOSTNAME; abc=2; echo abc is \$abc; 
EOF 
6

इस उदाहरण

ssh my_server "echo this is my_server; abc=2;" 

abc में दूरदराज के पक्ष में सेट किया गया है, तो यह स्पष्ट किया जाना चाहिए कारण है कि यह अपने स्थानीय मशीन पर सेट नहीं है।

अगले उदाहरण में,

ssh my_server "echo this is my_server; abc=2; echo abc is $abc" 

अपने स्थानीय खोल बहस में $abc का विस्तार करने से पहले यह कभी दूरस्थ होस्ट को भेजा जाता है की कोशिश करता है। एक मामूली संशोधन काम करेगा के रूप में आप की उम्मीद:

ssh my_server 'echo this is my_server; abc=2; echo abc is $abc' 

एकल उद्धरण $abc का विस्तार करने की कोशिश कर रहा से अपने स्थानीय खोल रोकने के लिए, और इतने शाब्दिक पाठ दूरस्थ होस्ट से यह बनाता है।


अंत में अपने असली सवाल करने के लिए, इस प्रयास करें:

jabref_dir=$(ssh my_server 'jabref_exe=$(which jabref); jabref_dir=$(dirname $jabref_exe); 
       java -jar $jabref_dir/../jabref.jar > /dev/null; echo $jabref_dir') 

यह आपके दूरस्थ सर्वर पर एक कमांड के रूप में उद्धृत स्ट्रिंग चलेंगे, और उत्पादन ठीक एक स्ट्रिंग: $jabref_dir। उस स्ट्रिंग को आपके स्थानीय होस्ट पर एक चर में कैप्चर और संग्रहीत किया जाता है।

+0

धन्यवाद, जो मुझे सही रास्ते पर रखता है। उलटा कॉमा या '\ $' द्वारा विस्तार को रोकना महत्वपूर्ण था। यह पता चला कि सर्वर पर डिफ़ॉल्ट खोल tcsh था, और यह एक और कारण था 'abc = 2' काम नहीं किया। – craq

+0

ग्रेट उत्तर। मैं जेएसकिंस का उपयोग एसएसएच एजेंट प्लगइन के साथ कर रहा हूं और यह एक आकर्षण की तरह काम करता है। –

संबंधित मुद्दे