小弟在使用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
麻烦各位大佬帮看下我这问题,看我这应该怎么改能符合预期
shell中提示多种可能的处理(expect send)
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx
- astolia
- 论坛版主
- 帖子: 6494
- 注册时间: 2008-09-18 13:11
Re: shell中提示多种可能的处理(expect send)
你对expect的运行方式理解错误。expect顺序执行你的命令,你输入了expect "*installer's language*",它就一直会等待installer's language出现,直到超时。然后再去执行下一行的send "E\r"
如果想达到对符合条件的文本执行特定命令的话,应该把命令放到expect命令后面。expect也支持等待多条文本其中之一出现再执行不同的命令
或者写成下面这种形式可读性会好些
具体语法可自行查看expect的manpage
如果想达到对符合条件的文本执行特定命令的话,应该把命令放到expect命令后面。expect也支持等待多条文本其中之一出现再执行不同的命令
代码: 全选
expect "*installer's language*" { send "E\r" } "*请选择安装语言*" { send "C\r" }
代码: 全选
expect {
"*installer's language*" { send "E\r" }
"*请选择安装语言*" { send "C\r" }
}
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx
Re: shell中提示多种可能的处理(expect send)
感谢大佬。还有个问题想咨询下,我在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
}
#设置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
}
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx
Re: shell中提示多种可能的处理(expect send)
找到答案了,试了下可行。
#设置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
}
#设置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
- 论坛版主
- 帖子: 6494
- 注册时间: 2008-09-18 13:11
Re: shell中提示多种可能的处理(expect send)
所谓磨刀不误砍柴工,如果你有空去看看sudo的manpage,就会知道它可以通过设置特定参数直接从stdin读取密码,一个echo加个管道就搞定了,根本不需要你费那么多事用expect来输入
-
- 帖子: 8
- 注册时间: 2024-01-10 18:19
- 系统: liunx