我有一个程序需要一些不可打印的字符,例如0x0F( ctrl+ o) 作为输入来执行程序的预期部分。
0 000 00 NUL � Null char
1 001 01 SOH  Start of Heading
2 002 02 STX  Start of Text
3 003 03 ETX  End of Text
4 004 04 EOT  End of
它是在命令行上执行的,知道如何将不可打印的字符插入命令行作为程序的输入吗?
答案1
该printf
实用程序支持八进制字符转义:
- 除了 XBD 文件格式表示法 (
'\\'
,'\a'
,'\b'
,'\f'
,'\n'
,'\r'
,'\t'
,'\v'
) 中显示的转义序列之外,"\ddd"
, 其中滴滴是一位、两位或三位八进制数,应以八进制数指定的数值写入字节。
printf
至少 Bash 和 Zsh 中的内置函数还支持十六进制转义序列\xHH
以及$'...'
引号,它们以类似的方式插入转义序列。
因此,要在某些命令的命令行参数中使用此类字符,请执行以下操作:
$ somecmd "arg_with_$(printf '\017')_xoff"
或者如果您需要多次使用该字符,请将其放入变量中
$ xoff=$(printf '\017')
$ somecmd "many${xoff}odd${xoff}chars"
或者,将两个字节0x0f 0x11
(017 021
八进制)传输到注释中提到的命令:
$ printf "\x0f\x11" | somecmd...
$ printf "\017\021" | somecmd...
答案2
这取决于外壳; ZSH提供$\NNN
表格
% perl -e 'printf "%vx\n", shift' $'\177'
7f
%
在这两个选项中,zsh
另一个ksh
选项是使用control+vand thenreturn应该^M
在命令行中插入 a ,尽管这可能很乏味并且可能使 shell 历史记录过于复杂。
如果缺少这些,另一种选择是运行一个发出适当字符的程序
% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' )
f
%
或者使用一个带有适合您的程序的参数的小型 C 程序;这将避免 shell 可能添加的任何复杂情况
#include <err.h>
#include <unistd.h>
int main(void)
{
execlp("perl", "perl", "-e", "printf \"%vx\\n\", shift", "\x0F",
(char *) 0);
err(1, "exec failed");
return 1;
}
答案3
这个命令完成了工作
printf '\x0f\x11' | program