如何编写一个bash脚本来给出另一个程序响应

时间:2011-01-19 03:52:51

标签: linux bash

我有一个bash脚本,可以在新数据库上执行多项任务,包括python manage.py syncdb。此命令要求输入,例如admin的登录信息。目前,我只是每次都在命令行中键入它。有没有办法可以自动提供这些回复作为bash脚本的一部分?

谢谢,我对bash一无所知。

我正在使用Ubuntu 10.10。

4 个答案:

答案 0 :(得分:3)

如果相关程序无法读取stdin的输入,例如:

echo "some input" | your_progam

然后你需要查看类似expect和/或autoexepect

的内容

答案 1 :(得分:3)

我在SF上回答similar question,但是这个更为一般,并且最好是在SO上。

“你想使用expect。它可能已经在你的机器上[try which expect]。它是任何类型的交互式命令行自动化的标准工具。它是一个Tcl库,所以你将免费获得一些Tcl技能。小心;它会让人上瘾。“

在这种情况下我应该提到还有pexpect,这是Python期望的。

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

答案 2 :(得分:0)

您可以为变量指定默认值。在第4行和第5行中,如果未设置变量RSRC和LOCAL,则将它们设置为这些默认值。这样,您可以为脚本提供选项或使用默认选项

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

答案 3 :(得分:0)

您可以这样做,给出一个示例login.py脚本:

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)

好credentials.txt

root
password

坏credentials.txt

user
foo

然后您可以使用以下命令自动登录:

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

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

这种方法的缺点是你用纯文本存储密码,这不是很好的做法。

相关问题