如何同时使用expect和shell脚本

如何同时使用expect和shell脚本,shell,tcl,expect,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 dinesh@VirtualBox:~$ sudo mkdir /usr/lib/dinesh7 [sudo] p

我正在使用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
dinesh@VirtualBox:~$ sudo mkdir /usr/lib/dinesh7
[sudo] password for dinesh: 
dinesh@VirtualBox:~$ 
但是上面的命令没有安装openssh客户端。它只是显示命令。没有安装任何东西


我哪里做错了?

在apt-get中需要pass-y,就像这样:
spawn sudo-apt-get-y openssh-client

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


另外,您不需要运行两个shell,只需
#/usr/bin/expect
就足够了。

openssh客户端安装
spawn
之后,您必须
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. :)" }
在上面的代码中,使用文字“$”的原因是终端提示的原因

#!/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
dinesh@VirtualBox:~$ sudo mkdir /usr/lib/dinesh7
[sudo] password for dinesh: 
dinesh@VirtualBox:~$ 
终端中具有
$
符号的最后一行。根据您的终端,您可以自定义提示。您可能想知道为什么我们必须第二次发送密码。请记住,这不是通常的终端,在终端关闭之前,为管理员提供密码就足以执行其他管理员操作。有了
expect
,我们每次都会产生
sudo
,这是我们再给它一次的原因

正如Andrew指出的,您不需要添加
#带有
bash
路径

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

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

你好非常感谢你的清楚解释。我遵循了相同的过程,并且能够正确执行命令。但是,如果我使用“spwan wget”下载一个文件,然后执行“expect”$”,则不会完全下载该文件。在文件下载的10%时,会转到下一个命令。我认为expect在等待特定提示时会出现默认超时。我们如何更改它?