1

我有点困惑,我似乎无法弄清楚,我相信这很容易..

我有一个外部shell脚本,我们称之为“install.sh”,用于安装我们公司开发的一个软件。我想使用 expect (带有外部参数)自动化 install.sh 过程,因为它很容易在输出字符串上进行模式匹配并传入一堆参数,作为数组或参数传递给期望脚本。

不幸的是,网上的许多示例都是针对“scp”或“ftp”的,而这些对我来说都不感兴趣,因为我正在尝试自动化一个简单的安装脚本,而不是那些交互式 shell,而不是“脚本”。

这是我正在尝试创建的简单期望脚本的示例:

# !/usr/bin/expect
# passed arguments
set domPassw [lindex $argv 1]
set joinDomain [lindex $argv 2]
set cdcVersion [lindex $argv 3]
set domUser [lindex $argv 4]

# cd over
cd /Users/wqcoleman/Desktop/suite-mac10.6/;

# start install
spawn ./install.sh

# first match
expect "Install the 5.1.0 package? (Q|Y|N) [Y]:"
send "Y\r"

我确信我可以在这里变得聪明并在 bash 脚本中执行此操作,但就我而言,这更难,我宁愿有一个简单的迭代脚本来“匹配”输出并发送输入,看起来对我来说更简单。

我有两个基本问题。

  1. 在上面运行时,它似乎没有“触发” ./install.sh 脚本。没有什么?没有什么可匹配的?什么都没有输出。
  2. 我需要以 root 身份运行 ./install.sh 脚本,当我最初启动它时,我认为 spawn 会有一些“提升”的启动,但它没有,所以我不知道如何在这里执行此操作。

我打算运行这样的东西:

#!/bin/bash
# Ask for the administrator password upfront
sudo -v

# Keep-alive: update existing `sudo` time stamp until `.update` has finished
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &

# cd over
cd /Users/wqcoleman/Desktop/suite-mac10.6/;

# start install
spawn ./install.sh

然后进入期望,但这根本不起作用..所以我不确定从哪里开始,编写一个bash脚本并在里面调用期望?还是编写一个期望脚本并在其中调用带有提升提示符的 install.sh ?

任何建议都是最有帮助的。

4

2 回答 2

3
#!/bin/bash
.......
.......
expect -c "
spawn ./install.sh
expect \"Install the 5.1.0 package\? \(Q\|Y\|N\) \[Y\]\: \"
send \"Y\r\"
interact "
.......
.......
于 2013-01-15T02:58:38.153 回答
1

与其专注于期望脚本,您可能会获得更好的帮助来显示安装脚本需要哪些输入。该解决方案可能就像在其标准输入上提供对 install.sh 的响应一样简单:

install.sh << END_OF_RESPONSES
Y
answer1
answer2
answer3
END_OF_RESPONSES
于 2013-01-15T13:10:24.197 回答