2013-02-03 21 views
36

我正在创建我自己的bash脚本,但我现在卡住了。基本上,该脚本将用于在CentOS中自动进行服务器设置。有些软件通常要求用户输入密码。我希望脚本将我生成并存储为变量的密码,而不是询问用户。在bash脚本中模拟用户输入

在安装期间出现消息“New password:”时,如何让脚本将值存储在变量$key中,就好像用户使用bash脚本键入了它一样?

回答

38

你会发现'expect'命令会做你需要它做的事情。它广泛可用。在这里看到的例子:http://www.thegeekstuff.com/2010/10/expect-examples/

(非常粗略的例子)

#!/usr/bin/expect 
set pass "mysecret" 

spawn /usr/bin/passwd 

expect "password: " 
send "$pass" 
expect "password: " 
send "$pass" 
+0

是的,我用期待很多! – Napolux

+0

这里的伙计是“New password:”,当脚本用yum安装东西时(例如mysql),你可以向我展示这个特殊情况的代码片段。我主要使用sed并从未使用expect。教程你提供了,它似乎你可以使用期望当用户想要输入的东西 – Werulz

+1

看看'#!'行 - 这是一个Expect *脚本*。整个事情由'expect'运行,而不是'bash'运行,所以它是用Expect语言编写的(基本上是Tcl),重要的命令在那里 - 'spawn'用来启动你正在交互的命令,'expect'等待它发送一个特定的字符串,'发送'发送回复,如果你想把控制权交还给用户,你可以用'interact'来完成。 –

2

下面是一段代码,我写的剧本Ÿ索要用户的密码,并设置它们的/ etc/passwd文件。你可以操纵它有点可能得到你需要的东西:

echo -n " Please enter the password for the given user: " 
read userPass 
useradd $userAcct && echo -e "$userPass\n$userPass\n" | passwd $userAcct > /dev/null 2>&1 && echo " User account has been created." || echo " ERR -- User acount creation failed!" 
+0

你们给我错了。我不想读取用户输入。我想要做的是当(yum安装东西)需要用户输入密码时,它应该*放置*在变量中找到的值$ key作为输入,而不是要求用户输入内容 – Werulz

+0

就像在安装过程中出现“New Password:”提示时那样,在$ key中设置值为通过 – Werulz

+0

那样,只有期待才能完成这项工作。例如,当外部程序要求用户输入时,我曾用期望传递一个值。就像我想将我的ssh密钥添加到我的ssh-agent时一样,我会自动将密码短语通过期望传递给ssh-add。 – kevoroid