2014-10-06 3 views
6

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

perl में मैं एक साधारण रिमोट कमांड निष्पादित करना चाहता हूं और perl :: Expect का उपयोग कर आउटपुट कैप्चर करना चाहता हूं)। हालांकि मैंने पाया कि मेरा परिणाम सरणी कभी-कभी खाली होती थी। मैंने बहुत प्रयोग किया है और विश्वास है कि समस्या यह है कि रिमोट कमांड स्टेउट करने के लिए फ्लश से पहले मेरा रिमोट एसएसएच कनेक्शन समाप्त हो रहा है।

  • व्यवहार वही है जो चल रहा है चाहे बैश कमांड लाइन से सीधे perl :: अपेक्षित या ssh।
  • मेरे डेटा सेंटर में सभी होस्टों के पास यह व्यवहार है। मेजबान जितना अधिक लोड होता है उतनी बार त्रुटि होती है। भारी मेजबानों के लिए मैं लगभग 15% परिणाम प्राप्त करने में विफल रहता हूं। लाइटर होस्ट पर त्रुटि दर 0 के करीब है।
  • रिमोट कमांड कोई फर्क नहीं पड़ता।
  • मुझे पता है कि मैं पासवर्ड प्रॉम्प्ट और दूरस्थ होस्ट में जा रहा हूं। 'Ssh -vvv' का उपयोग करके मुझे रिमोट कमांड हर बार निष्पादित किया जाता है।
  • मैंने पीछे की ओर डमी कमांड निष्पादित करके और स्टडआउट बफर को फ़्लश करने की उम्मीदों में रिमोट रिटर्न कोड की जांच करके प्रयोग किया है। कुछ भी भरोसेमंद नहीं रहा है।

निम्नलिखित उदाहरणों में उपयोगकर्ता/समूह/होस्ट नामों को फिर से सक्रिय किया गया है। इसके अलावा आउटपुट एक unedited कट-एंड-पेस्ट है।

 
> while true ; do echo "start"; ssh -l user host 'date; ls -l abc; echo $?'; echo "end"; done 
start 
Password: 
Mon Oct 6 13:06:51 PDT 2014 
-rw-r--r-- 1 user group 34538 Dec 6 2012 abc 
0 
end 
start 
Password: 
end 
start 
Password: 
Mon Oct 6 13:06:54 PDT 2014 
end 

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

 
while true ; do echo "start"; ssh -l user host 'date | tee -a /tmp/date.txt' ; echo "end"; done 

इस उदाहरण में पर्ल विवरण पर लटका दिया मत। दिलचस्प बिट वापस @output सरणी है। पर्ल में मैं निम्न आदेश है:

स्थानीय :: rc :: Utils :: executeRemoteCommand ($ cmd, $ पास, 0, undef, undef, \ @output)

अंततः इस कॉल करने के लिए नीचे अभ्यास जो :

मेरी $ ssh = अपेक्षा-> स्पॉन ($ कमांड);

जिसके परिणामस्वरूप $ आदेश यह है: "; गूंज 'संपन्न'; ls -l एबीसी गूंज $"

ssh -l उपयोगकर्ता मेजबान

सफल 'प्रिंट डम्पर \ @output':

$VAR1 = [ 
     #0 
     " ", 
     #1 
     "-rw-r--r-- 1 user group 34538 Dec 6 2012 abc", 
     #2 
     "DONE", 
     #3 
     0 
    ]; 

विफल 'प्रिंट डम्पर \ @output':

$VAR1 = [ 
    #0 
    " ", 
    #1 
    "DONE", 
    #2 
    0 
]; 

नोट कैसे 'ls' से परिणाम अभी तक कब्जा कर लिया नहीं किया गया था 'डोने' की गूंज थी। मैंने यह भी देखा है कि आउटपुट सरणी में ls परिणाम है लेकिन गूंज नहीं है। मैंने यह भी देखा है कि दोनों परिणाम गायब थे।

किसी भी अंतर्दृष्टि की सराहना की जाएगी। इस बिंदु पर मैं स्टंप हो गया हूं और अब इन रिमोट कॉल्स को अपेक्षित परिणाम के लिए लूप जांच में प्रोग्राम करना होगा। यह एक भयानक हैक है। मैं मूल कारण को ठीक करना पसंद करूंगा।

धन्यवाद बहुत

+0

'" ssh -l उपयोगकर्ता होस्ट "ls -l abc; echo" done "; echo $?" ' कोई भी विशेष कारण' '' '' '' '' '' '' 'है। – Travis

+0

उद्धरणों की एक विषम संख्या भी है, मैं मौजूदा मूल्य के साथ '$? 'मूल्य की रक्षा के साथ प्रयोग करूँगा। तो मैं \ '\ $? ',' \\\ $? 'पर कुछ बदलावों का प्रयास करूंगा। सौभाग्य। – shellter

+0

ट्रैविस - उद्धरण निश्चित। यह इस पोस्ट में सिर्फ एक टाइपो था। वास्तविक निष्पादन सही था। सभी तीन आदेश दूरस्थ पक्ष पर निष्पादित किए जाते हैं। –

उत्तर

1

मैं इसे पुन: पेश नहीं कर सकता है, लेकिन हो सकता है आप ssh के लिए आयकर तर्क का उपयोग प्रयास करना चाहिए।

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