बैश शेल - ssh रिमोट स्क्रिप्ट कैप्चर आउटपुट और एग्जिट कोड?


23

मैं एक दूरस्थ सर्वर पर एक स्क्रिप्ट को लागू करने के लिए शेल का उपयोग करना चाहता हूं। मैं उस स्क्रिप्ट के आउटपुट (इसके लॉगिंग मैसेज) और उससे बाहर निकलने वाले कोड को कैप्चर करना चाहूंगा।

अगर मैं ऐसा करता हूं:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

मुझे निकास कोड मिलता है लेकिन दूरस्थ लॉगिंग संदेशों को कैप्चर नहीं कर सकता है।

अगर मैं ऐसा करता हूं:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

मुझे अपने लॉग फ़ंक्शन का उपयोग करके अपना आउटपुट लॉग करना है, लेकिन एक सही निकास कोड प्राप्त करने के लिए प्रतीत नहीं हो सकता है, मुझे लगता है कि मुझे जो कोड मिलेगा वह वेरिएबल असाइनमेंट से कोड है।

मैं सभी आउटपुट को कैप्चर करने के लिए अपने लॉग फ़ंक्शन का उपयोग करना जारी रखना चाहूंगा क्योंकि यह मेरे लिए एक फ़ाइल, साइसलॉग और स्क्रीन पर चीजों को भेजता है।

मैं एक var में परिणाम कैसे पकड़ सकता हूं और दूरस्थ स्क्रिप्ट से सही निकास कोड प्राप्त कर सकता हूं?


जवाबों:


37

कारण आपको सही त्रुटि कोड नहीं मिल रहा है, क्योंकि localवास्तव में निष्पादित अंतिम चीज़ है। कमांड चलाने से पहले आपको वैरिएबल को स्थानीय घोषित करना होगा।

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

आप इस मुद्दे को यहाँ देख सकते हैं:

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2

8

"स्थानीय" समस्या प्रतीत होती है। यह मेरे लिए काम करता है:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

तुम भी सही थे, लेकिन jodanm अधिक तेज था!
मार्कलिन

हाँ, 26 सेकंड।
हाऊक लैगिंग

5
अंग्रेजी वर्ग नहीं, लेकिन इसे 'अधिक तेज' कहना गलत है।
मत्तहम्मद

5
मुझे पता है कि यह एक मजाक था। एक बुरा मुझे लगता है। इंटरनेट पर कोई नहीं जानता कि आप एक कुत्ते हैं।
14

जोर्डनम का उत्तर भी बताता है कि यह समस्या क्यों थी :)
डॉकटोर जे।

2

दरअसल, ssh त्रुटि कोड और संदेश के ऊपर दिए गए उत्तरों में से कोई भी, जो निम्नानुसार किया जा सकता है (मेरे कस्टम कार्यों को अनदेखा करें):

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && doExit $exit_code $err_msg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.