Issues with Expect Script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Issues with Expect Script
# 1  
Old 03-03-2017
Issues with Expect Script

Hi,

does the expect script tries to match for everyline on the screen irrespective of the prompts???

Code:
spawn ./Inst.sh
expect "path? (Y/N)"
send "Y\r"
expect "folder path"
send "$DIR1\r"
expect "path? (Y/N)"
send "Y\r"
expect "folder path2"
send "$DIR2\r"

After the installer begins.. it displays various lines before the first expect.
But the script tries to match for every line that is displayed before the 1st and timeouts.

1)Why does it tries to match for every lines that is out in the screen?
Code:
expect: does "" (spawn_id exp5) match exact string "path? (Y/n)"? no
Native ignore this if not using solaris OS.no stlport in java.library.path
expect: does "Native ignore this if not using solaris OS.no stlport in java.library.path" (spawn_id exp5)
 match exact string "path? (Y/n)"? no

when it finds the actual matches - the send is passed
Code:
expect: does ".............................path? (Y/n) \r\n" (spawn_id exp5) match glob pattern "path? (Y/n)"? yes
 expect: set expect_out(0,string) "path? (Y/n)"
expect: set expect_out(spawn_id) "exp5"
 send: sending "Y\r" to { exp5 }


2) and also it appends the previous results to next and the expect statement is appended recursively
Code:
expect: does " \r\n" (spawn_id exp5) match glob pattern "folder path"? no
Y
expect: does " " (spawn_id exp5) match glob pattern "folder path$"? no
expect: does " \r\n" (spawn_id exp5) match glob pattern "folder path$"? no
Y
expect: does " \r\nY\r\n" (spawn_id exp5) match glob pattern "folder path$"? no
folder path:
expect: does " \r\nY\r\n\r\nfolder path: \r\n" (spawn_id exp5) match glob pattern "folder path$"? no
expect: timed out
send: sending "/path/xx\r" to { exp5 }

because of this the expect statements gets varying including the newlines and the order is not maintained.

what is that i'm missing here?

thanks
# 2  
Old 03-03-2017
You need \r at the end of expect commands, i.e. expect "path? (Y/N)\r"
# 3  
Old 03-05-2017
To avoid matching you previous send commands use set stty_init -echo near the top of your script.
If your prompts can vary order you could try matching them all in one multi choice expect command. In the below example I can match on any one of the three prompts and loop until and eof is found:

Code:
#!/usr/bin/expect --
set stty_init -echo
set DIR1 { /path/xx }
set DIR2 {/path/yy }

spawn ./Inst.sh

while {1} {
   expect {
       "path? (Y/N)" { send "Y\r" }
       "folder path" { send "$DIR1\r" }
       "folder path2" { send "$DIR2\r" }
       eof { break }
   }
}


Last edited by Chubler_XL; 03-05-2017 at 06:09 PM..
This User Gave Thanks to Chubler_XL For This Post:
# 4  
Old 03-07-2017
Thanks, i did tried setting set stty_init -echo and \r at the end.
But still the previous expects are concatenated recursively.

Issue :1
Actual expect "path"?

But from autoexpect when i tried to look for the actual expect
Code:
expect: does "" (spawn_id exp5) match exact string "path? (Y/n)"? no
Native ignore this if not using solaris OS.no stlport in java.library.path
expect: does "Native ignore this if not using solaris OS.no stlport in java.library.path" (spawn_id exp5)
 match exact string "path? (Y/n)"? no

Changing expect to
expect "Native ignore this if not using solaris OS.no stlport in java.library.path. path? (Y/n)" then only it matches and sends the response.
i tried regex to shorten this as the other expects concatenates huge stmts and timeout occurs.
# 5  
Old 03-07-2017
This is how expect works it will continue building it's buffer until it encounters the string it is looking for:

Code:
expect: does "" (spawn_id exp5) match exact string "path? (Y/n)"? no
Native ignore this if not using solaris OS.no stlport in java.library.path
expect: does "Native ignore this if not using solaris OS.no stlport in java.library.path" (spawn_id exp5)
 match exact string "path? (Y/n)"? no

See here your statement was expect "path? (Y/N)", the input buffer will continue to grow until it finds a match for this, or after a default of 10 seconds it will timeout.

If you are timing out it could be you are trying to match to the wrong prompt; or (what it sounds like in your case) the install script is taking a long time to get to the next prompt in which case you may just need to extend the timeout eg:

Code:
pawn ./Inst.sh
expect "path? (Y/N)"
send "Y\r"

# Install does a lot of stuff here after the path? (Y/N) prompt above
# so we extend the timeout to 20 seconds
set timeout 20
expect "folder path"
send "$DIR1\r"

# restore the timeout back to default (10 seconds)
set timeout 10
expect "path? (Y/N)"
send "Y\r"
expect "folder path2"
send "$DIR2\r"

# 6  
Old 03-08-2017
Thanks!

when i tried to provide exact request- before the timeout happens it kind of matched.But does it has to be always the "exact" as few expects - they are longer. and even after increasing timeout it doesnt match for a shorten statements

Actually for every next expect the installer does lot of stuffs
Code:
pawn ./Inst.sh
expect "\r\npath? (Y/N) "
send "Y\r"
send "\r\n$DIR1: "
expect "\r\npath? (Y/N) "
send "Y\r"
expect "\r\n\r\nfolder path2 : "
send "$DIR2\r"
expect "\r\r\n---------------------------------------------\r\nlicense-----(y/n) : "
send ""Y\r"

for the license expect - only if the full statement it matches and doesnt work for
expect "license (y/n):"

Thanks.
# 7  
Old 03-08-2017
For matching your license prompt I'd be tempted to use a regular expression like:

Code:
expect -re {-{10}\r\nlicense-+\(y/n\) : }

This is a little complex and need some explanation.

Firstly I usually quote my regular expressions in expect (and tcl) with { and } instead of double quotes (").
This is because regular expressions tend to contain a lot of special characters which would otherwise be evaluated by tcl,
angled brackets suppress any expansion on the strings within them think of them as the same as single quotes in shell scripts.

So the above can be thought of as saying match the regular expression -{10}\r\nlicense-+\(y/n\) :

-{10} = exactly ten hyphen characters, we could have simply used ---------- instead but this is shorter

-+ = one (or more) hyphen characters; plus symbol in a regular expression means repeat the proceeding expression one or more times

\(y/n\) round brackets are special characters to a regular expression characters so we use backslash to quote them. They then simply match regular bracket characters.

So what sort of strings will the RE match?

Here are 3 examples:

Code:
-------------------------
license-(y/n) :

----------
license---------------------------(y/n) :

----------IGNORED--TEXT----------
license---------------------------(y/n) :

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Expect script returning string following a found expect.

I'm fairly new to scripting so this might not be possible. I am using Expect with Cisco switches and need to capture the string after finding the expect request. For example, when I issue "show version" on a Nexus switch, I'm looking to capture the current firmware version: #show version ... (0 Replies)
Discussion started by: IBGaryA
0 Replies

2. Shell Programming and Scripting

SFTP or scp with password in a batch script without using SSH keys and expect script

Dear All, I have a requirement where I have to SFTP or SCP a file in a batch script. Unfortunately, the destination server setup is such that it doesn't allow for shell command line login. So, I am not able to set up SSH keys. My source server is having issues with Expect. So, unable to use... (5 Replies)
Discussion started by: ss112233
5 Replies

3. Programming

Calling another expect script inside an expect script

I have an expect script called remote that I want to call from inside my expect script called sudoers.push, here is the code that is causing me issues: set REMOTE "/root/scripts/remote" ... log_user 1 send_user "Executing remote script as $user...\n" send_user "Command to execute is: $REMOTE... (1 Reply)
Discussion started by: brettski
1 Replies

4. UNIX for Advanced & Expert Users

Unable to run the script on remote machine Using Expect script

Not able to execute the file in remote host using except utility I am automating the SFTP keys setp process: So i created the expect script for controlling the output of shell below is my main code: Code: #!/usr/bin/expect set fd set password close $fd set df set app close $df... (1 Reply)
Discussion started by: Manoj Bajpai
1 Replies

5. Programming

Calling expect script inside another expect

Hi, Am very new to expect scripting.. Can You please suggest me how to call an expect script inside another expect script.. I tried with spawn /usr/bin/ksh send "expect main.exp\r" expect $root_prompt and spawn /usr/bin/ksh send "main.exp\r" expect $root_prompt Both... (1 Reply)
Discussion started by: Priya Amaresh
1 Replies

6. Shell Programming and Scripting

Expect script help needed- script failing if router unavailable

Hey all. Sometimes I'm tasked to change some router configs for the entire network (over 3,000 Cisco routers). Most of the time its a global config parameter so its done with a loop and an IP list as its the same configuration change for all routers. This is working OK. However, sometimes an... (3 Replies)
Discussion started by: mrkz1974
3 Replies

7. Shell Programming and Scripting

Expect issues

Hi all, I'm new with expect. I'm developing a quick script to check my sudo access on 100 servers. So using !/bin/usr/expect doesn't work. So decided to use it as : expect -c "set timeout -1;\ spawn ssh $IPADDR -l $USERID ;\ match_max 100000;\ expect { -re... (0 Replies)
Discussion started by: EmersonOrci
0 Replies

8. Shell Programming and Scripting

Need help with Expect script for Cisco IPS Sensors, Expect sleep and quoting

This Expect script provides expect with a list of IP addresses to Cisco IPS sensors and commands to configure Cisco IPS sensors. The user, password, IP addresses, prompt regex, etc. have been anonymized. In general this script will log into the sensors and send commands successfully but there are... (1 Reply)
Discussion started by: genewolfe
1 Replies

9. Shell Programming and Scripting

Issues with Expect

Here is a snippet of code that work for me: expect "abc" {send_log "abc found" } \ "def" {send_log "def found" } \ "123" {send_log "123 found} however the following does not and according to the book "Exploring Expect" it should be equivalent: expect { "abc"... (1 Reply)
Discussion started by: twk
1 Replies

10. Shell Programming and Scripting

strange expect script behavior, or am i misunderstanding expect scripting?

Hello to all...this is my first post (so please go easy). :) I feel pretty solid at expect scripting, but I'm running into an issue that I'm not able to wrap my head around. I wrote a script that is a little advanced for logging into a remote Linux machine and changing text in a file using sed.... (2 Replies)
Discussion started by: v1k0d3n
2 Replies
Login or Register to Ask a Question