टाइमआउट की अपेक्षा, बैश स्क्रिप्टिंग में


13

मैं निम्नलिखित स्क्रिप्ट में "उम्मीद" के लिए टाइमआउट कैसे जोड़ सकता हूं? मैं इसे 120 सेकंड के रूप में सेट करना चाहता हूं।

#!/bin/bash
HOST="localhost"
USER="myuname"
PASS="mypassword"

VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

echo "==============="
echo "$VAR"

जवाबों:


13

expectइसके मैनपेज के हिसाब से डिफॉल्ट टाइमआउट 10 सेकंड है। इसे 120 सेकंड में बदलने के लिए, पहले spawn ssh $USER@$HOST, लाइन जोड़ें

set timeout 120

इसे बनाने के लिए

VAR=$(expect -c "
set timeout 120
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

2

उम्मीद के लिए मैन पेज के निम्नलिखित एक्सट्रैक्ट के अनुसार:

"उम्मीद [[-opts] pat1 body1] ... [-opts] patn [bodyn]

प्रतीक्षा करता है जब तक कि पैटर्न में से एक स्पॉन्ड प्रक्रिया के आउटपुट से मेल नहीं खाता है, एक निर्दिष्ट समय अवधि बीत चुकी है, या एक एंड-ऑफ-फ़ाइल देखी गई है। यदि अंतिम निकाय खाली है, तो इसे छोड़ा जा सकता है।

सबसे हालिया अपेक्षित_अभियान आदेश के पैटर्न को किसी अन्य पैटर्न से पहले अंतर्निहित रूप से उपयोग किया जाता है। सबसे हालिया अपेक्षित_ आफ्टर कमांड से पैटर्न को किसी अन्य पैटर्न के बाद स्पष्ट रूप से उपयोग किया जाता है।

यदि संपूर्ण प्रत्याशित कथन के तर्कों को एक से अधिक लाइन की आवश्यकता होती है, तो सभी तर्क एक में "लट" हो सकते हैं ताकि प्रत्येक लाइन को बैकस्लैश के साथ समाप्त करने से बचें। इस एक मामले में, ब्रेसिज़ के बावजूद सामान्य Tcl प्रतिस्थापन होंगे।

यदि एक पैटर्न कीवर्ड ईओफ़ है, तो संबंधित निकाय को फ़ाइल के अंत में निष्पादित किया जाता है। यदि कोई पैटर्न कीवर्ड टाइमआउट है, तो संबंधित बॉडी को टाइमआउट पर निष्पादित किया जाता है। यदि कोई टाइमआउट कीवर्ड का उपयोग नहीं किया जाता है, तो टाइमआउट पर एक अंतर्निहित शून्य कार्रवाई निष्पादित होती है। डिफ़ॉल्ट टाइमआउट अवधि 10 सेकंड है, लेकिन उदाहरण के लिए, "सेट टाइमआउट 30" कमांड द्वारा 30 पर सेट किया जा सकता है। एक अनंत टाइमआउट मान -1 द्वारा निर्दिष्ट किया जा सकता है। यदि कोई पैटर्न कीवर्ड डिफ़ॉल्ट है, तो संबंधित निकाय को टाइमआउट या एंड-ऑफ़-फ़ाइल पर निष्पादित किया जाता है।

यदि एक पैटर्न मेल खाता है, तो संबंधित निकाय निष्पादित किया जाता है। उम्मीद है कि शरीर का परिणाम (या खाली स्ट्रिंग अगर कोई पैटर्न से मेल नहीं खाता)। इस घटना में कि कई पैटर्न मेल खाते हैं, पहले दिखने वाला एक निकाय का चयन करने के लिए उपयोग किया जाता है। ... "


1

@DerfK ने आपके प्रश्न का उत्तर दिया है। मैं रखरखाव के लिए अपनी स्क्रिप्ट को फिर से तैयार करूँगा, हालांकि:

#!/bin/bash
export HOST="localhost"
export USER="myuname"
export PASS="mypassword"

script=<<'END_OF_SCRIPT'
    set timeout 120
    spawn ssh $env(USER)@$env(HOST)
    expect "password:"
    send "$env(PASS)\r"
    expect "\$"
    send "ls\r"
    expect -re "$env(USER).*"
    send "logout"
    expect eof
END_OF_SCRIPT

VAR=$(expect -c "$script")

echo "==============="
echo "$VAR"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.