我有一个bash脚本来完成几个任务,包括python manage.py syncdb
在新的数据库上。该命令要求输入,如管理员的登录信息。目前,我只是每次都在命令行中输入它。有没有办法让我自动提供这些回复作为bash脚本的一部分?如何编写一个bash脚本来提供另一个程序响应
谢谢,我真的不知道什么bash。
我使用的是Ubuntu 10.10。
我有一个bash脚本来完成几个任务,包括python manage.py syncdb
在新的数据库上。该命令要求输入,如管理员的登录信息。目前,我只是每次都在命令行中输入它。有没有办法让我自动提供这些回复作为bash脚本的一部分?如何编写一个bash脚本来提供另一个程序响应
谢谢,我真的不知道什么bash。
我使用的是Ubuntu 10.10。
我在SF上回答了一个similar question,但这个更通用一些,在SO上也很好。
“你想用expect这一点。这可能已经在你的机器上[尝试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
如果有问题的程序不能从stdin
如读取输入:
echo "some input" | your_progam
,那么你就需要寻找到像expect
和/或autoexepect
你可以给默认值变量。在第4行和第5行中,如果变量RSRC和LOCAL未设置,则将它们设置为这些默认值。这样,你可以给的选项脚本或使用默认的
#!/bin/bash
RSRC=$1
LOCAL=$2
: ${RSRC:="/var/www"}
: ${LOCAL:="/disk2/backup/remote/hot"}
rsync -avz -e 'ssh ' [email protected]:$RSRC $LOCAL
你能做到这样,给出的例子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
这种方法的下侧是你以纯文本格式,这是不是伟大实践中存储密码。
我相信Python正在从stdin中读取数据。 – 2011-01-19 03:57:55