Mark
Mark

Reputation: 6464

get the result of remote command in Expect

I have Expect script invoked from a bash script. The Expect script spawns a ssh session and runs a remote command. I want to have a return code of the remote command available in my shell script.

# !/bin/sh
expect -f remote.exp 192.168.1.100 user pass 10.10.10.1
# here I want to analyze exit status of remotely invoked command

The expect script is below, here is my ugly workaround:

#!/usr/bin/expect

set timeout 20
set box [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set target [lindex $argv 3]

spawn ssh -l $user $box

expect "*password:"
send "$password\r\n"

expect "*#"
send "ping -c1 $target\r\n"
expect "*#"

send "echo $?\r"
expect {
  "0\r" { puts "Test passed."; }
  timeout { puts "Test failed."; }
}

expect "*#"

PS. I read that expect_out may help me, but I failed to get it work. Any help will be greatly appreciated! Thanks.

Upvotes: 2

Views: 6694

Answers (1)

Hai Vu
Hai Vu

Reputation: 40688

I have tried the following and it works on a Mac:

#!/usr/bin/expect

# Process command parameters
foreach {host user password target} $argv {break}
set command "ping -c 1 $target"

# Log in
spawn ssh -l $user $host
expect -nocase "password:"
send "$password\r"

# Send the command
expect "$ "
send "$command\r"

# Echo the return code, the key here is to use the format code=X instead
# just a single digit. This way, Expect can find it
expect "$ "
send "echo code=$?\r"

# Analyze the result
set testResult "Test failed."
expect {
    "code=0" { set testResult "Test passed." }
}
puts "$testResult"

# Done, exit
expect "$ "
send exit

Note a few differences:

  1. The shell prompt on my system is "$ "
  2. I only send \r, not \r\n. I don't know if it matters
  3. I exit the ssh session by sending "exit"

Upvotes: 4

Related Questions