shell中提示多种可能的处理(expect send)

sh/bash/dash/ksh/zsh等Shell脚本
回复
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

shell中提示多种可能的处理(expect send)

#1

帖子 359976140@qq.com » 2024-01-10 19:02

小弟在使用expect做交互式场景自动化时,在该场景中某个操作因为环境不一样,在页面显示的捕获信息也不一样。现在碰到一个问题就是我的expect和send出现实际效果不对应情况。比如
/usr/bin/expect << EOF
set timeout 30
spawn ./$softName -i
expect "*installer's language*"
send "E\r"
expect "*请选择安装语言*"
send "C\r"
expect eof
EOF

本意是想
1、英文环境下,控制台出现“installer's language”时输入E;
2、中文环境下,控制台出现“请选择安装语言” 时输入C,
但现在在中文环境下实际效果是输入了E,通过控制台可以看到,稍后也会输入C

麻烦各位大佬帮看下我这问题,看我这应该怎么改能符合预期
头像
astolia
论坛版主
帖子: 6450
注册时间: 2008-09-18 13:11

Re: shell中提示多种可能的处理(expect send)

#2

帖子 astolia » 2024-01-10 22:31

你对expect的运行方式理解错误。expect顺序执行你的命令,你输入了expect "*installer's language*",它就一直会等待installer's language出现,直到超时。然后再去执行下一行的send "E\r"

如果想达到对符合条件的文本执行特定命令的话,应该把命令放到expect命令后面。expect也支持等待多条文本其中之一出现再执行不同的命令

代码: 全选

expect "*installer's language*" { send "E\r" } "*请选择安装语言*" { send "C\r" }
或者写成下面这种形式可读性会好些

代码: 全选

expect {
  "*installer's language*" { send "E\r" }
  "*请选择安装语言*"         { send "C\r" }
}
具体语法可自行查看expect的manpage
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

Re: shell中提示多种可能的处理(expect send)

#3

帖子 359976140@qq.com » 2024-01-11 10:29

感谢大佬。还有个问题想咨询下,我在function中写一段expect没问题,但写多段就会报我语法错误。不能识别}。再帮看下是哪儿问题。非常不好意思因为工作比较忙去详细学习没这么多时间
#设置apt源
function setApt {
if [ -d /etc/apt/bak ];then
/usr/bin/expect << EOF
set timeout 2
spawn sudo mkdir -p /etc/apt/bak
expect "*输入密码*" {send "${sudoPasswd}\r"}
expect eof
EOF
fi

if [ -e /etc/apt/sources.list ];then
/usr/bin/expect << EOF
set timeout 2
spawn sudo mv /etc/apt/sources.list /etc/apt/bak/sources.list-${curTime}
expect "*输入密码*" {send "${sudoPasswd}\r"}
expect eof
EOF
fi


/usr/bin/expect << EOF
set timeout 2
spawn sudo curl -o /etc/apt/sources.list http://172.16.75.47:9999/sp-code/apps/u ... urces.list
expect "*输入密码*" {send "${sudoPasswd}\r"}
spawn sudo apt update
expect "*输入密码*" {send "${sudoPasswd}\r"}
expect eof
EOF

}
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

Re: shell中提示多种可能的处理(expect send)

#4

帖子 359976140@qq.com » 2024-01-11 11:27

找到答案了,试了下可行。
#设置apt源
function setApt {
if [ -d /etc/apt/bak ];then
/usr/bin/expect <<-EOF
set timeout 2
spawn sudo mkdir -p /etc/apt/bak
expect "*输入密码*" {send "${sudoPasswd}\r"}
expect eof
EOF
fi

if [ -e /etc/apt/sources.list ];then
/usr/bin/expect <<-EOF
set timeout 2
spawn sudo mv /etc/apt/sources.list /etc/apt/bak/sources.list-${curTime}
expect "*输入密码*" {send "${sudoPasswd}\r"}
expect eof
EOF
fi


/usr/bin/expect <<-EOF
set timeout 2
spawn sudo curl -o /etc/apt/sources.list http://172.16.75.47:9999/sp-code/apps/u ... urces.list
expect "*输入密码*" {send "${sudoPasswd}\r"}
spawn sudo apt update
expect "*输入密码*" {send "${sudoPasswd}\r"}
expect eof
EOF

}
头像
astolia
论坛版主
帖子: 6450
注册时间: 2008-09-18 13:11

Re: shell中提示多种可能的处理(expect send)

#5

帖子 astolia » 2024-01-12 10:35

359976140@qq.com 写了: 2024-01-11 10:29 非常不好意思因为工作比较忙去详细学习没这么多时间
所谓磨刀不误砍柴工,如果你有空去看看sudo的manpage,就会知道它可以通过设置特定参数直接从stdin读取密码,一个echo加个管道就搞定了,根本不需要你费那么多事用expect来输入
359976140@qq.com
帖子: 8
注册时间: 2024-01-10 18:19
系统: liunx

Re: shell中提示多种可能的处理(expect send)

#6

帖子 359976140@qq.com » 2024-01-15 16:30

astolia 写了: 2024-01-12 10:35
359976140@qq.com 写了: 2024-01-11 10:29 非常不好意思因为工作比较忙去详细学习没这么多时间
所谓磨刀不误砍柴工,如果你有空去看看sudo的manpage,就会知道它可以通过设置特定参数直接从stdin读取密码,一个echo加个管道就搞定了,根本不需要你费那么多事用expect来输入
看了下,确实有个-S参数。多谢指点
回复