Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Expect in a Bash script

Tags:

bash

expect

I am trying to write a script that pulls the latest version of my software from a Git repository and updates the configuration files. When pulling from the repository though, I have to enter a password. I want the script to automate everything, so I need it to automatically fill it in for me. I found this site that explained how to use Expect to look for the password prompt and send the password. I can't get it to work though.

Here's my script:

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
set timeout -1

clear
echo "Updating Source..."
cd sourcedest
git pull -f origin master

match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof

git checkout -f master
cp Config/database.php.bak Config/database.php
cp webroot/index.php.bak webroot/index.php
cp webroot/js/config.js.bak webroot/js/config.js

What am I doing wrong?

Here's the site I got it from: http://bash.cyberciti.biz/security/expect-ssh-login-script/

like image 221
LordZardeck Avatar asked May 01 '12 05:05

LordZardeck


1 Answers

This is pretty much taken from the comments, with a few observations of my own. But nobody seems to want to provide a real answer to this, so here goes:

Your problem is you have an Expect script and you're treating it like a Bash script. Expect doesn't know what cd, cp, and git mean. Bash does. You want a Bash script that makes a call to Expect. For example:

#!/usr/bin/env bash

password="$1"
sourcedest="path/to/sourcedest"
cd $sourcedest

echo "Updating Source..."
expect <<- DONE
  set timeout -1

  spawn git pull -f origin master
  match_max 100000

  # Look for password prompt
  expect "*?assword:*"
  # Send password aka $password
  send -- "$password\r"
  # Send blank line (\r) to make sure we get back to the GUI
  send -- "\r"
  expect eof
DONE

git checkout -f master
cp Config/database.php.bak Config/database.php
cp webroot/index.php.bak webroot/index.php
cp webroot/js/config.js.bak webroot/js/config.js

However, as larsks pointed out in the comments, you might be better off using SSH keys. Then you could get rid of the expect call altogether.

like image 198
Tim Pote Avatar answered Sep 20 '22 06:09

Tim Pote