linux - 在期望脚本中发送不可打印的字符
问题描述
我发现当我在期望脚本中使用某些字节作为程序的输入时,当一个字节高于 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 替换 '')。
如何在期望脚本中强制执行相同的行为?
解决方案
经过更多的实验,我发现唯一的方法是在期望逻辑之外进行参数切换,例如:
set input [binary format H* 7f80]
exec echo "$input" > input.dat
spawn sh -c "./myprog `cat input.dat`"
请注意,由于 $ 的特殊含义,使用 ${...} 代替反引号似乎并不容易。
当然,直接生成 shell 而不是进程不是一回事,但这对我的大多数用例来说并不重要。
推荐阅读
- configuration - Azure Function App 的生产配置
- r - 在R中替换句子的第N个单词的模式
- reactjs - 使用 Redux 重新渲染 React 功能组件
- c++ - 删除和替换新 IR 代码时指令不支配所有用途
- ibm-information-server - 输入 SMTP 服务器的用户名和密码
- javascript - 如何使用 querySelectorAll() 查找表行的第一个单元格
- perf - PERF_RECORD_SAMPLE 中的不同字段是什么意思?
- c# - 应用程序作为 Windows 任务运行时出现“不知道这样的主机”FluentFTP 错误
- python - 如何控制一维卷积模型的重叠?
- javascript - 一些 javascript 资产获得 404 spring 5