Sandip Divekar
Sandip Divekar

Reputation: 157

How to write expect snippet in bash script to run remote command?

Currently I am running this script to print directories on a remote box but I am not sure this code is working.

#!/bin/bash

PWD="test123"
ip="10.9.8.38"
user=$1
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no $user@$ip df -h
expect "*assword:"
send "$PWD\n"
interact
EOD

Upvotes: 0

Views: 651

Answers (1)

Inian
Inian

Reputation: 85825

expect spawns a new sub-shell, hence your local bash variables lose their scope, one way to achieve this is to export your variables to make it available for the sub-shell. Use the Tcl env built-in to import such variables in your script.

#!/bin/bash

export pwdir="test123"
export ip="10.9.8.38"
export user=$1
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no "$env(user)"@"$env(ip)" df -h
expect "*assword:"
send "$env(pwdir)\n"
interact
EOD

(Or) If you are not interested in using an expect script directly with a #!/usr/bin/expect she-bang, you can do something like

#!/usr/bin/expect

set pwdir [lindex $argv 0];
set ip [lindex $argv 1];
set user [lindex $argv 2];
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no $user@$ip df -h
expect "*assword:"
send "$pwdir\n"
interact

and run the script as

./script.exp "test123" "10.9.8.38" "johndoe"

Upvotes: 2

Related Questions