在命令行中输入不可打印的字符

在命令行中输入不可打印的字符

我有一个程序需要一些不可打印的字符,例如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实用程序支持八进制字符转义:

  1. 除了 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 0x11017 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

相关内容