Caracteres não imprimíveis como entrada na linha de comando

1

Eu tenho um programa que requer alguns caracteres não imprimíveis como 0x0F ( ctrl + o ) como entrada para executar a parte pretendida o programa.

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 

E está sendo executado na linha de comando, alguma idéia de como inserir caracteres não imprimíveis na linha de comando como entrada de um programa?

    
por F.sb 18.06.2017 / 16:29

3 respostas

0

este comando fez o trabalho

printf '\x0f\x11' | program
    
por 03.08.2017 / 18:51
5

O utilitário printf suporta escapes de caracteres octais:

  1. In addition to the escape sequences shown in XBD File Format Notation ( '\', '\a', '\b', '\f', '\n', '\r', '\t', '\v' ), "\ddd", where ddd is a one, two, or three-digit octal number, shall be written as a byte with the numeric value specified by the octal number.

O printf embutido em pelo menos Bash e Zsh também suporta sequências de escape hexadecimais \xHH e também as $'...' quotes, que interpelam as sequências de escape de forma semelhante.

Então, para usar esses caracteres em argumentos de linha de comando para algum comando, faça algo assim:

$ somecmd "arg_with_$(printf '7')_xoff"

ou coloque-o em uma variável se você precisar usar o caractere mais de uma vez

$ xoff=$(printf '7')
$ somecmd "many${xoff}odd${xoff}chars"

Ou, para canalizar os dois bytes 0x0f 0x11 ( 017 021 em octal) para um comando como mencionado nos comentários:

$ printf "\x0f\x11" | somecmd...
$ printf "71" | somecmd...
    
por 18.06.2017 / 17:06
2

Isso depende do shell; O ZSH oferece um $\NNN form

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

Em zsh e ksh , outra opção seria usar control + v e, em seguida, retornar , o que deve inserir ^M na linha de comando, embora isso possa ser entediante e possa complicar demais o histórico do shell.

Na falta deles, outra opção é rodar um programa que emite os caracteres apropriados

% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' )
f
% 

Ou para usar um pequeno programa em C com os argumentos apropriados para o seu programa; isso evitará complicações que o shell possa adicionar

#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;
}
    
por 18.06.2017 / 16:52