पहले समस्या यह है कि खोल नेस्टेड दोहरे उद्धरण चिह्नों की व्याख्या नहीं करता है के रूप में आप की तरह हो सकता है। इसे ठीक करने का सबसे आसान तरीका एक्सपेक्ट प्रोग्राम को सिंगल कोट्स में रखना है। यह तब तक पर्याप्त होगा जब तक कि उम्मीद कार्यक्रम में कोई एकल उद्धरण न हो।
अगली समस्या जो आप दौड़ेंगे, यह है कि एक ही expect
कमांड में सभी पैटर्न और कार्रवाइयां उन्हें समानांतर में संसाधित करती हैं। वास्तव में क्या होता है कि पहले Password:
पैटर्न किसी भी समय उस स्ट्रिंग को देखता है (यानी व्यवस्थापक पासवर्ड के लिए दूसरी बार भी)। यदि दो पासवर्ड अलग होने की आवश्यकता है तो यह एक समस्या होगी। कम से कम, समान पैटर्न को expect
कमांड में जाने की आवश्यकता होगी ताकि उन्हें अनुक्रमिक रूप से निष्पादित किया जा सके। यह समस्या Prompt#
पैटर्न को भी प्रभावित करती है जहां आप इसे तीन बार देखते हैं और तीन अलग-अलग प्रतिक्रियाएं भेजना चाहते हैं।
बाद में, आपको पहला स्पष्ट आदेश भेजने के बाद एक त्रुटि मिलेगी। उम्मीद है कि डबल कोट्स के अंदर स्क्वायर ब्रैकेट्स को इस तरीके से व्याख्या करें कि $()
या ``
(यानी कमांड प्रतिस्थापन) की व्याख्या कैसे करें। आप इस तरह एक त्रुटि देखेंगे:
invalid command name "confirm"
while executing
"confirm"
invoked from within
"expect {
⋮
यह confirm
एक Tcl के रूप में चलाने के लिए (या अपेक्षा) आदेश करने की कोशिश कर रहा है। इस व्याख्या को करने से टीसीएल को रोकने के लिए आप घुंघराले ब्रैकेट्स ({}
) का उपयोग कर सकते हैं। इसके अलावा, उम्मीद है कि पैटर्न को डिफ़ॉल्ट रूप से "ग्लोब" अभिव्यक्ति के रूप में माना जाता है (यानी शैल वाइल्डकार्ड की तरह), इसलिए यदि आप पैटर्न के रूप में {[confirm]}
लिखते हैं, तो भी यह सटीक स्ट्रिंग मैच के लिए उपयोग नहीं किया जाएगा (यह किसी एकल वर्ण c
से मेल खाता है, o
, n
, f
, i
, r
, या m
)। सटीक मिलान के लिए पैटर्न को चिह्नित करने के लिए आपको -ex
ध्वज का उपयोग करना होगा।
इन मुद्दों को ठीक करें, अनावश्यक के हवाले से कुछ छोड़ देते हैं और आप कुछ इस तरह से खत्म हो सकता है:
#!/bin/sh
VAR=$(expect -c '
proc abort {} {
puts "Timeout or EOF\n"
exit 1
}
spawn telnet 1.1.1.1
expect {
Password: { send "password1\r" }
default abort
}
expect {
Prompt> { send "en\r"; exp_continue }
Password: { send "password2\r" }
default abort
}
expect {
Prompt# { send "clea line 10\r"; exp_continue }
-ex {[confirm]} { send "Y\r" }
default abort
}
expect {
Prompt# { send "clea line 11\r"; exp_continue }
-ex {[confirm]} { send "Y\r" }
default abort
}
expect {
Prompt# { send "exit\r"; exp_continue }
timeout abort
eof
}
puts "Finished OK\n"
')
echo "$VAR"
स्रोत
2011-04-07 11:34:56
विस्तृत स्पष्टीकरण के लिए धन्यवाद। यह वास्तव में मेरी समस्या को हल करने में मेरी मदद करता है मैंने दो और बदलाव किए हैं जिन्हें मैं एक ही पोस्ट के अलग जवाब में बता रहा हूं। – Pkp