Bash和Expect:有没有办法忽略或删除Expect缓冲区中的ANSI控制序列?

时间:2014-02-14 22:23:16

标签: linux bash expect

我正在使用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。没有太大的区别。

1 个答案:

答案 0 :(得分:1)

不确定这是否会有所帮助,但您可以为ssh和exec创建一个包装器,而不是ssh,然后

ssh <host> | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b

如果您不需要,可以取出过滤换行符的col -b。