2013-04-25 15 views
5

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

1 #!/usr/bin/expect 
    2 exp_internal 1 
    3 log_user 0 
    4 set timeout 10 
    5 set password "******" 
    6 
    7 spawn /usr/bin/ssh -l subhasish *.*.*.* -p 10022 
    8 
    9 expect { 
10  -re "password: " {send "$password\r"} 
11  -re "$ " {send "sudo su\r"} 
12  -re "[sudo] password for subhasish:" {send "$password\r"} 
13  -re "# " {send "service iptables status\r"} 
14  } 
15 set output $expect_out(buffer) 
16 send "exit\r" 
17 puts "$output\r\n" >> output.log 

लेकिन डीबग मोड में चलाते समय, मुझे इस तरह की त्रुटि मिल रही है;

expect -d testcase 
expect version 5.44.1.15 
argv[0] = expect argv[1] = -d argv[2] = testcase 
set argc 0 
set argv0 "testcase" 
set argv "" 
executing commands from command file testcase 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {24105} 
invalid command name "sudo" 
    while executing 
"sudo" 
    invoked from within 
"expect { 
    -re "password: " {send "$password\r"} 
    -re "$ " {send "sudo su\r"} 
    -re "[sudo] password for subhasish:" {send "$password\r"} 
..." 
    (file "testcase" line 9) 

यह सुनिश्चित नहीं है कि मैं कहां गलत हो रहा हूं। यह अमान्य कमांड नाम "सुडो" कहता है, मुझे लगता है कि ऐसा इसलिए है क्योंकि उम्मीदें इन आदेशों को समझ नहीं पाती हैं। इसके आसपास कैसे जाना है। कृपया मदद करे। धन्यवाद।

उत्तर

11

समस्या इस लाइन

-re "[sudo] password for subhasish:" {send "$password\r"} 

Tcl में (और इसलिए उम्मीद में) वर्ग कोष्ठक आदेश प्रतिस्थापन के लिए वाक्यविन्यास (शेल में बैकटिक) की तरह कर रहे हैं में है।

-re {[sudo] password for subhasish:} {send "$password\r"} 

यह एक अलग मुद्दा लाता है: आप इन सटीक पात्रों को देखने के लिए उम्मीद कर रहे हैं तो आप या तो कोष्ठक बचने या अलग उद्धरण है कि विभिन्न विस्तार को रोकने का उपयोग करने की आवश्यकता है? क्योंकि आप नियमित अभिव्यक्ति के रूप में इसका इलाज करने की उम्मीद कर रहे हैं, और एक नियमित अभिव्यक्ति में स्क्वायर ब्रैकेट का मतलब एक चरित्र वर्ग है, इसलिए यह एक ही चरित्र से मेल खाता है, या तो 'एस', 'यू', 'डी' या 'ओ' '।

-re {\[sudo\] password for subhasish:} {send "$password\r"} 

या

-ex {[sudo] password for subhasish:} {send "$password\r"} 
+0

मैंने सुडो सु को "सबहाशीश के लिए पासवर्ड" की उम्मीद की है और यह भी बताया कि आपने कैसे उल्लेख किया है, न ही यह काम कर रहा है; नीचे दिए गए कोड का उपयोग करके, #!/usr/bin/expect -f #!/Bin/bash सेट टाइमआउट 60 log_user 1 सेट मेजबान *। *। *। * सेट पासवर्ड ****** output.txt अंडे ssh -p 10022 $ उपयोगकर्ता सेट उपयोगकर्ता Subhasish सेट लॉगफ़ाइल @ $ मेजबान उम्मीद "* assword: *" भेजें - "$ पासवर्ड \ r" log_user 1 उम्मीद "$" भेजने - "sudo सु \ r" उम्मीद "Subhasish के लिए पासवर्ड:" भेजें - - "$ पासवर्ड \ r" उम्मीद है कि "#" भेजें - "सेवा iptables स्थिति \ r" log_file /home/subhasish/output.log "#" log_file भेजें - "बाहर निकलें \ r"; भेजें - "बाहर निकलें \ r"; बाहर निकलें –

+0

मैन्युअल लॉगिंग इस तरह दिखता है, [रूट @ लोकलहोस्ट सबहाशीश] # ssh -p 10022 [email protected]*.*.*.* [email protected]*.*.*.* पासवर्ड है: अंतिम लॉगिन: सोम अप्रैल 2 9 07:19:52 2013 से *। *। *।* [Subhasish @ testhost ~] $ sudo सु [sudo] Subhasish के लिए पासवर्ड: [जड़ @ testhost Subhasish] # –

+0

डिबग स्क्रिप्ट से पता चलता है अपने में अटक उम्मीद: उम्मीद: करता है "\ r \ Nlast लॉगिन: सोम अप्रैल 29 07:35:36 2013 से *। *। *। * \ R \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 "(spawn_id exp4) मिलान ग्लोब पैटर्न" subhasish के लिए पासवर्ड: "? नहीं [subhasish @ testhost ~] $ उम्मीद है: "\ r \ n अंतिम लॉगिन: सोम अप्रैल 29 07:35:36 2013 से *। *। *। * \ r \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 \ u001b [? 1034h [subhasish @ testhost ~] $ "(spawn_id exp4) मैच ग्लोब पैटर्न" subhasish के लिए पासवर्ड: "? नहीं –

3

धन्यवाद ग्लेन, यह अब काम कर रहा है: तो क्या आप शायद जरूरत यह है। एक और कारण है कि यह काम नहीं कर रहा था, यह सामान्य लॉगिन और sudo लॉगिन के बीच सोने के लिए की आवश्यकता है, अन्यथा "sudo सु" से पहले $ शीघ्र लौट आए भेजा जा रहा था, दूसरों के लिए संदर्भ के लिए, यहाँ कोड है था

#!/usr/bin/expect -f 
#! /bin/bash 

set timeout 60 
log_user 1 
set host *.*.*.* 
set password ****** 
set user subhasish 
set logfile output.txt 
spawn ssh -p 10022 [email protected]$host 
expect "*?assword:*" 
send -- "$password\r" 
#log_user 1 
sleep 2 
expect "$" 
send -- "sudo su\r" 
expect -gl {*password for subhasish:*} 
send -- "$password\r" 
expect "#" 
send -- "service iptables status\r" 
log_file /home/subhasish/output.log 
expect "#" 
log_file 
send -- "exit\r"; 
send -- "exit\r"; 
exit 0 
+0

प्रॉम्प्ट की प्रतीक्षा करना बहुत उपयोगी था। – phyatt

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