gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:23:19 25 4
gpt4 key购买 nike

我正在使用 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。它只是显示命令。并且没有安装任何东西。

我哪里做错了?

最佳答案

openssh-client 安装上执行 spawn 之后,你必须 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,这是不同的,这就是再给它一次的原因。

正如 Andrew 所指出的,您不需要在 bash 路径中添加 #!

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

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

关于shell - 如何一起使用 expect 和 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26631710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com