我正在使用Expect通过(虚拟)串口连接到我的服务器。 (HP iLo,具体而言)
从Linux OS ISO映像启动时,最终会进入“启动:”提示符。当我的服务器到达该提示时,我想输入我自己的自定义启动选项并按Enter键。容易,对吧?
当您观看我的Expect脚本执行时,这就是启动提示的样子(看起来很正常):
boot:
但是,我无法匹配' boot:'。查看我的日志文件中的Expect Buffer,这是为该行捕获的内容:
ESC\[25;01HbbESC\[25;01HESC\[25;02HooESC\[25;02HESC\[25;03HooESC\[25;03HESC\[25;04HttESC\[25;04HESC\[25;05H::ESC\[25;05HESC\[25;06H ESC\[25;06HESC\[25;07H"
我认为所有这些控制序列都搞砸了我的比赛。如果仔细观察' boot:'实际上就在那里,但它被我认为是ANSI控制序列所包围。
实际上,日志文件绝对是ANSI控制字符。
我一直在玩的Expect脚本的相关部分:
bash #] expect -d -c '
.....
# SSH to the Virtual Serial Port Management server
spawn ssh user@1.2.3.4
.....
# Access the Virtual Serial Port for the server being booted
send "vsp\r"
.....
# After rebooting the server, when the boot: prompt appears, enter boot options
expect {
"boot:" {send $bootOptions \r\n"}
timeout {send_user "Never found boot prompt\n"; send_user "$expect_out(buffer)"; exit 1}
}
.....
exit'
关于处理这些控制角色的最佳方法的任何想法都是?我已经尝试在我正在运行脚本的机器上导出TERM = dumb和TERM = vt1000。没有太大的区别。
答案 0 :(得分:1)
不确定这是否会有所帮助,但您可以为ssh和exec创建一个包装器,而不是ssh,然后
ssh <host> | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b
如果您不需要,可以取出过滤换行符的col -b。