使用expect脚本自动执行install.sh脚本

时间:2013-01-15 01:13:29

标签: bash automation expect

我有点遗憾,我似乎无法弄清楚,我确信这很容易......

我有一个外部shell脚本,我们称之为“install.sh”,用于安装我们公司开发的软件。我想使用expect(使用外部参数)自动化install.sh进程,因为在输出字符串上模式匹配并传递一堆参数非常容易,无论是作为数组还是参数到expect脚本。

不幸的是,许多在线示例都是针对“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会有一些 “升级”开始,但没有,所以我不知道该怎么做。
  3. 我打算运行这样的事情:

    #!/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
    

    然后滚动到expect,但是这并没有全部工作..所以我不知道从哪里开始,写一个bash脚本并调用期望内部?或编写一个expect脚本并在其中调用带有提升提示的install.sh?

    任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:3)

#!/bin/bash
.......
.......
expect -c "
spawn ./install.sh
expect \"Install the 5.1.0 package\? \(Q\|Y\|N\) \[Y\]\: \"
send \"Y\r\"
interact "
.......
.......

答案 1 :(得分:1)

您可以更好地帮助显示安装脚本所需的输入,而不是专注于expect脚本。解决方案可能就像在stdin上提供对install.sh的响应一样简单:

install.sh << END_OF_RESPONSES
Y
answer1
answer2
answer3
END_OF_RESPONSES