我正在尝试编写一个脚本,从git repo中提取我的软件的最新版本并更新配置文件。从回购中提取时,我必须输入密码。我希望脚本能够自动化所有内容,所以我需要它来自动填充它。我发现这个网站解释了如何使用“expect”来查找密码提示并发送密码。我不能让它工作。这是我的剧本:
#!/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
我做错了什么?这是我从以下网站获得的网站:http://bash.cyberciti.biz/security/expect-ssh-login-script/
答案 0 :(得分:17)
这几乎是从评论中得出的,我自己也有一些观察。但似乎没有人愿意为此提供真正的答案,所以这里有:
您的问题是您有 expect 脚本,并且您将其视为 bash 脚本。 Expect不知道cd
,cp
和git
是什么意思。巴什呢。你想要的是一个调用期望的bash脚本。例如:
#!/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 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
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
但是,正如larsks在评论中指出的那样,使用ssh密钥可能会更好。然后你可以完全摆脱expect
电话。