Command-Line

不可列印的字元作為命令行中的輸入

  • August 3, 2017

我有一個程序需要一些不可列印的字元,例如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 

它正在命令行上執行,知道如何將不可列印的字元插入命令行作為程序的輸入嗎?

printf實用程序支持八進製字元轉義:

  1. 除了 XBD 文件格式符號 ( '\\', '\a', '\b', '\f', '\n', '\r', '\t', '\v')中顯示的轉義序列外"\ddd",其中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...

這取決於外殼;ZSH提供$\NNN表格

% perl -e 'printf "%vx\n", shift' $'\177'
7f
% 

在這兩個選項中zshksh另一個選項是使用control+vand then returnwhich 應該將 a 插入^M命令行,儘管這可能很乏味並且可能會使 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;
}

引用自:https://unix.stackexchange.com/questions/371797