2013-03-13 8 views
10

शैल स्क्रिप्ट में एक लूप में, मैं विभिन्न सर्वर से कनेक्ट कर रहा हूं और कुछ कमांड चला रहा हूं। उदाहरणशैल स्क्रिप्ट एसएसएच कमांड निकास स्थिति

#!/bin/bash 
FILENAME=$1 
cat $FILENAME | while read HOST 
do 
    0</dev/null ssh $HOST 'echo password| sudo -S 
    echo $HOST 
    echo $?  
    pwd 
    echo $?' 
done 

यहाँ के लिए मैं "गूंज $ होस्ट" और "pwd" आदेशों चल रहा हूँ और मैं के माध्यम से बाहर निकलें स्थिति हो रही है "गूंज $?"।

मेरा सवाल यह है कि मैं कुछ चर में दूरस्थ रूप से चलाने वाले आदेशों की निकास स्थिति को संग्रहीत करने में सक्षम होना चाहता हूं और फिर (यदि आदेश सफल था या नहीं), स्थानीय फ़ाइल में एक लॉग लिखें।

कोई भी मदद और कोड की सराहना की जाती है।

उत्तर

19

ssh रिमोट कमांड के बाहर निकलने के कोड से बाहर निकल जाएगा। उदाहरण के लिए:

$ ssh localhost exit 10 
$ echo $? 
10 

तो अपने ssh आदेश बाहर निकलता है के बाद, आप बस $? देख सकते हैं। आपको यह सुनिश्चित करने की ज़रूरत है कि आप अपना रिटर्न वैल्यू मास्क न करें।

while read HOST; do 
    echo $HOST 
    if ssh $HOST 'somecommand' < /dev/null; then 
    echo SUCCESS 
    else 
    echo FAIL 
done 

आप भी इस तरह यह लिख सकते हैं::

echo $? 

यह हमेशा वापस आ जाएगी 0. क्या आप शायद चाहते हैं और अधिक कुछ इस तरह है: उदाहरण के लिए, अपने ssh कमांड के साथ खत्म

while read HOST; do 
    echo $HOST 
    if ssh $HOST 'somecommand' < /dev/null 
    if [ $? -eq 0 ]; then 
    echo SUCCESS 
    else 
    echo FAIL 
done 
+0

क्या आप कह रहे हैं कि मुझे प्रत्येक कमांड चलाने के लिए अलग से ssh करने की आवश्यकता है ताकि मैं उनकी निकास स्थिति निकाल सकूं? मैं अपने असली कोड में एक ही एसएसएच सत्र में कम से कम 5 कमांड चलाने की कोशिश कर रहा हूं। –

+0

हाय, @ लार्क्स। क्या आप समझा सकते हैं कि 'ssh localhost exit 10' का अर्थ क्या है? इसका मतलब एसएसएच लोकहोस्ट को स्टेटस कोड के रूप में स्पष्ट 10 के साथ निष्पादित करना है? यहां, बाहर निकलने का विकल्प ssh या linux कमांड 'exit' का विकल्प है? –

+0

याद रखें कि एसएसएच कमांड का मूल वाक्यविन्यास 'ssh ' है। तो उपर्युक्त उत्तर में, 'निकास 10' रिमोट शैल को पास किया गया आदेश है। – larsks

0

एक दिलचस्प दृष्टिकोण बैकटिक्स का उपयोग कर स्थानीय चर में प्रत्येक एसएसएच कमांड सेट के पूरे आउटपुट को पुनर्प्राप्त करना होगा, या यहां तक ​​कि एक विशेष चरखी के साथ अलग होना (सादगी के लिए ":") कुछ जैसे ething: इस के बाद

export MYVAR=`ssh $HOST 'echo -n ${HOSTNAME}\:;pwd'` 

आप awk का उपयोग अपने परिणामों में MYVAR विभाजित है और पार्टी के परीक्षण जारी रखने के लिए कर सकते हैं।

0

शायद इस तरह, दूसरी तरफ और पाइप यह stdout करने के लिए पर लॉग फ़ाइल तैयार:

ssh -n [email protected] 'x() { local ret; "[email protected]" >&2; ret=$?; echo "[`date +%Y%m%d-%H%M%S` $ret] $*"; return $ret; }; 
x true 
x false 
x sh -c "exit 77";' > local-logfile 

मूल रूप से सिर्फ रिमोट आप इस x आवरण के साथ आह्वान करने के लिए चाहते हैं पर सब कुछ लगा दें। यह सशर्त के लिए भी काम करता है, क्योंकि यह कमांड के निकास कोड को नहीं बदलता है।

आप आसानी से इस आदेश को लूप कर सकते हैं।

[20141218-174611 0] true 
[20141218-174611 1] false 
[20141218-174611 77] sh -c exit 77 
बेशक

आप बेहतर parsable बनाने या अपने whishes के अनुकूल लॉगफ़ाइल की तरह लग जाएगा कि कैसे कर सकते हैं:

यह उदाहरण लॉग की तरह कुछ में लिखता है। ध्यान दें कि रिमोट प्रोग्राम्स के uncatched सामान्य stdoutstderr पर लिखा गया है (x() में पुनर्निर्देशन देखें)।

यदि आपको लॉगफाइल के लिए कमांड के आउटपुट को पकड़ने और तैयार करने के लिए नुस्खा की आवश्यकता है, तो https://gist.github.com/hilbix/c53d525f113df77e323d से ऐसे कैचर की एक प्रति यहां दी गई है - लेकिन हां, यह एक बड़ा बॉयलरप्लेट है "खोल के वर्तमान संदर्भ में कुछ चलाएं , postprocessing stdout + वापसी कोड को परेशान किए बिना "stderr:

# Redirect lines of stdin/stdout to some other function 
# outfn and errfn get following arguments 
# "cmd args.." "one line full of output" 
: catch outfn errfn cmd args.. 
catch() 
{ 
local ret o1 o2 tmp 
tmp=$(mktemp "catch_XXXXXXX.tmp") 
mkfifo "$tmp.out" 
mkfifo "$tmp.err" 
pipestdinto "$1" "${*:3}" <"$tmp.out" & 
o1=$! 
pipestdinto "$2" "${*:3}" <"$tmp.err" & 
o2=$! 
"${@:3}" >"$tmp.out" 2>"$tmp.err" 
ret=$? 
rm -f "$tmp.out" "$tmp.err" "$tmp" 
wait $o1 
wait $o2 
return $ret 
} 

: pipestdinto cmd args.. 
pipestdinto() 
{ 
local x 
while read -r x; do "[email protected]" "$x" </dev/null; done 
} 

STAMP() 
{ 
date +%Y%m%d-%H%M%S 
} 

# example output function 
NOTE() 
{ 
echo "NOTE `STAMP`: $*" 
} 

ERR() 
{ 
echo "ERR `STAMP`: $*" >&2 
} 

catch_example() 
{ 
# Example use 
catch NOTE ERR find /proc -ls 
} 

(नीचे स्क्रॉल) एक उदाहरण के लिए दूसरा अंतिम पंक्ति देखें

2

आप कर के रूप में सरल रूप में एक चर के लिए बाहर निकलें स्थिति असाइन कर सकते हैं:

var_name= $? 

आदेश के ठीक बाद आप निरीक्षण करने की कोशिश कर रहे हैं। echo $? पहले या $? का नया मान echo (आमतौर पर 0) का निकास कोड नहीं होगा।

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