首页 > 解决方案 > 在期望脚本中发送不可打印的字符

问题描述

我发现当我在期望脚本中使用某些字节作为程序的输入时,当一个字节高于 0x7f 时,会自动转换为多字节。例如脚本中的以下行:

spawn ./myprog [exec perl -e { print "\x7f\x80" }]

实际上向 myprog 发送了三个而不是两个字节:0x7f 0xc2 0x80

myprog 是一个简单的测试程序,它打印它得到的输入:

int main(int argc, char** argv) {
   int i;
   for (i=0;i<strlen(argv[1]);i++) {
      printf("%x\n", (unsigned char)argv[1][i]);
}

我知道 0x7f 是与 unicode 相关的编码的神奇边界,但是我怎样才能将像 0x80 这样的字节发送到我的程序呢?在期望脚本中,我已经尝试过https://www.tcl.tk/doc/howto/i18n.html中描述的 [encoding convertto iso8859-1 [exec perl ...]] 之类的转换,但没有任何效果。

另一方面,当我在命令行上做同样的事情时,例如:

./myprog `perl -e 'print "\x7f\x80"'`

我确实只得到了两个字节 - 正如预期的那样(与期望脚本行相比,不同的 {} 是 tcl 替换 '')。

如何在期望脚本中强制执行相同的行为?

标签: linuxexpect

解决方案


经过更多的实验,我发现唯一的方法是在期望逻辑之外进行参数切换,例如:

set input [binary format H* 7f80]
exec echo "$input" > input.dat
spawn sh -c "./myprog `cat input.dat`"

请注意,由于 $ 的特殊含义,使用 ${...} 代替反引号似乎并不容易。

当然,直接生成 shell 而不是进程不是一回事,但这对我的大多数用例来说并不重要。


推荐阅读