Nick Heiner
Nick Heiner

Reputation: 122640

How to write a bash script to give another program response

I have a bash script that does several tasks, including python manage.py syncdb on a fresh database. This command asks for input, like the login info for the admin. Currently, I just type this into the command line every time. Is there a way I can automatically provide these replies as part of the bash script?

Thanks, I don't really know anything about bash.

I'm using Ubuntu 10.10.

Upvotes: 4

Views: 5583

Answers (4)

Zac Thompson
Zac Thompson

Reputation: 12685

I answered a similar question on SF, but this one is more general, and it's good to have on SO.

"You want to use expect for this. It's probably already on your machine [try which expect]. It's the standard tool for any kind of interactive command-line automation. It's a Tcl library, so you'll get some Tcl skills along the way for free. Beware; it's addictive."

I should mention in this case that there is also pexpect, which is a Python expect-alike.

#!/path/to/expect
spawn python manage.py syncdb
expect "login:*"
send -- "myuser\r"
expect "*ssword:*"
send -- "mypass\r"
interact

Upvotes: 3

mpenkov
mpenkov

Reputation: 21932

You can do it like this, given an example login.py script:

if __name__ == '__main__':
    import sys
    user = sys.stdin.readline().strip()
    passwd = sys.stdin.readline().strip()

    if user == 'root' and passwd == 'password':
        print 'Login successful'
        sys.exit(0)

    sys.stderr.write('error: invalid username or password\n')
    sys.exit(1)

good-credentials.txt

root
password

bad-credentials.txt

user
foo

Then you can do the login automatically using:

$cat good-credentials.txt | python login.py
Login successful

$cat bad-credentials.txt | python login.py 
error: invalid username or password

The down-side of this approach is you're storing your password in plain text, which isn't great practice.

Upvotes: 0

nunopolonia
nunopolonia

Reputation: 14427

You can give defaults values to the variables. In line 4 and 5, if the variables RSRC and LOCAL aren't set, they are set to those default values. This way you can give the options to your script or use the default ones

#!/bin/bash
RSRC=$1
LOCAL=$2
: ${RSRC:="/var/www"}
: ${LOCAL:="/disk2/backup/remote/hot"}
rsync -avz -e 'ssh ' user@myserver:$RSRC $LOCAL

Upvotes: 0

SiegeX
SiegeX

Reputation: 140567

If the program in question cannot read the input from stdin such as:

echo "some input" | your_progam

then you'll need to look to something like expect and/or autoexepect

Upvotes: 3

Related Questions