8

我正在尝试编写一个脚本,从 Git 存储库中提取我的软件的最新版本并更新配置文件。但是,从存储库中提取时,我必须输入密码。我希望脚本自动执行所有操作,因此我需要它自动为我填写。我发现这个网站解释了如何使用 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/

4

1 回答 1

20

这几乎取自评论,并附有我自己的一些观察。但似乎没有人想对此提供真正的答案,所以这里是:

您的问题是您有一个Expect脚本,并且您将其视为 Bash脚本。Expect 不知道cd,cp和是什么git意思。巴什会。您需要一个调用 Expect 的 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 password prompt
  expect "*?assword:*"
  # Send password aka $password
  send -- "$password\r"
  # Send blank line (\r) to make sure we get back to the 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电话了。

于 2012-05-07T00:34:23.850 回答