如何将expect和shell脚本一起使用

时间:2014-10-29 13:31:21

标签: shell tcl expect

我正在使用expect脚本和一些shell脚本命令,如下所示。

#!/usr/bin/expect
#!/bin/bash
spawn sudo mkdir -p /usr/lib/jvm1
expect "\[sudo\] password for hduser:"
send "cisco\r"

spawn sudo apt-get install openssh-client

但是上面的命令没有安装openssh-client。它只显示命令。没有安装。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

spawn安装上执行openssh-client后,您必须expect获取某些内容,以便expect等待。否则,expect不会为任何事情烦恼而只会退出。在这种情况下,我们可以等待eof确认安装已完成。

#!/usr/bin/expect
spawn sudo mkdir /usr/lib/jvm1
# This will match the ": " at the end. That is why $ symbol used here.
expect ": $"; # It will be more robust than giving as below 
  #expect "\[sudo\] password for hduser:" 
send "password\r"
#This will match the literal '$' symbol, to match the '$' in terminal prompt
expect "\\$"
spawn sudo apt-get install openssh-client
expect ": $"
send "password\r"
expect eof { puts "OpenSSH Installation completed successfully. :)" }

在上面的代码中,使用文字' $'的原因是终端提示的原因。动作的手动交互如下。

dinesh@VirtualBox:~$ sudo mkdir /usr/lib/dinesh7
[sudo] password for dinesh: 
dinesh@VirtualBox:~$ 

终端中具有$符号的最后一行。根据您的终端,您可以自定义提示。您可能想知道为什么我们必须第二次发送密码。请记住,它不是通常的终端,在终端关闭之前,为其他管理员操作提供管理员密码。使用expect,我们每次都会生成sudo,这是不同的,这就是给它一次的原因。

正如安德鲁指出的那样,您不需要使用#!路径添加bash

更新expect中,默认超时为10 seconds。您可以使用set进行更改,如下所示。

set timeout 60; # Timeout will happen after 60 seconds.

答案 1 :(得分:2)

你需要在apt-get中传递-y,如下所示:spawn sudo apt-get install -y openssh-client

- 或 - 期待安装提示并回答“Y”

此外,您不需要运行两个shell,只需#!/usr/bin/expect即可。

相关问题