शायद इस तरह, दूसरी तरफ और पाइप यह 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 सामान्य stdout
stderr
पर लिखा गया है (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
}
(नीचे स्क्रॉल) एक उदाहरण के लिए दूसरा अंतिम पंक्ति देखें
क्या आप कह रहे हैं कि मुझे प्रत्येक कमांड चलाने के लिए अलग से ssh करने की आवश्यकता है ताकि मैं उनकी निकास स्थिति निकाल सकूं? मैं अपने असली कोड में एक ही एसएसएच सत्र में कम से कम 5 कमांड चलाने की कोशिश कर रहा हूं। –
हाय, @ लार्क्स। क्या आप समझा सकते हैं कि 'ssh localhost exit 10' का अर्थ क्या है? इसका मतलब एसएसएच लोकहोस्ट को स्टेटस कोड के रूप में स्पष्ट 10 के साथ निष्पादित करना है? यहां, बाहर निकलने का विकल्प ssh या linux कमांड 'exit' का विकल्प है? –
याद रखें कि एसएसएच कमांड का मूल वाक्यविन्यास 'ssh' है। तो उपर्युक्त उत्तर में, 'निकास 10' रिमोट शैल को पास किया गया आदेश है। –
larsks