cat está preso em um arquivo específico

2

Eu tenho um script python que gera um arquivo (cap.pcap). quando eu executo o gato nele, ele fica preso para sempre (não exibe nada). Eu tentei executar:

  1. O arquivo de comandos, hd e vi. Eles funcionam corretamente.
  2. lsof e fusor, eles não mostram nada.
  3. cp para outro arquivo e gato no segundo. Fica preso.
  4. dd para outro arquivo, mesmo resultado.
  5. < base64 cap.pcap > b64; < base64 -d b64 > cap2.pcap; cat cap2.pcap; fica preso novamente.
  6. Enviou o conteúdo base64 para outra máquina e testou-o; funcionou corretamente.

Além disso, quando executo o cat em qualquer outro arquivo: funciona.

Versões:

  • Ubuntu 18.04.1
  • cat (GNU coreutils) 8,28

Apenas no caso de isso poder ajudar, a parte do seguinte script python é responsável por isso:

import pcapy
data = []

cap = pcapy.open_live("enp0s3" , 65536 , 1 , 0)
dumper = cap.dump_open('cap.pcap')
for i in range(20):
    hdr, pkt = cap.next()
    dumper.dump(hdr, pkt)
    if i%10 == 9:
        f = open('cap.pcap', 'rb+')
        data += f.read();
        f.truncate(0)
        f.close()
dumper.close()
    
por Hédi Ghédiri 04.11.2018 / 02:06

2 respostas

2

Resposta curta

  1. Você pode quase sempre assumir que não é culpa do cat ; é muito difundido, bem testado e simples para ter erros tão grandes e óbvios.
  2. Não apenas cat um arquivo binário para o seu terminal; terminais são projetados para mostrar texto, não dados binários arbitrários.

Resposta longa

Não é o processo cat em si que fica preso, mas o emulador de terminal, ou seja, o programa que exibe a janela. cat não poderia se importar menos com o que está realmente no arquivo, tudo o que ele faz é copiar o que estiver nele para o stdout¹. Você pode (teoricamente) cat /dev/sda e, felizmente, despejar todo o conteúdo do HDD no seu terminal.

Os emuladores de terminal não são projetados para exibir dados binários arbitrários. Eles são feitos para mostrar texto, e é possível controlar como o texto é exibido, incorporando sequências especiais de caracteres não imprimíveis neles, chamados códigos de controle ou códigos de escape , já que a maioria deles começa com o" caractere de escape "( \x1B , geralmente exibido como ^[ ).

Agora, se você despejar dados binários em seu terminal, ele poderá ver um caractere de escape (ou qualquer outro caractere especial) e tentar interpretar um código de escape a partir dele. Isso significa que ele não exibirá os seguintes caracteres, pelo menos até que possa decidir se eles realmente formam uma sequência válida ou não. Outra possibilidade é que há uma seqüência válida embutida em algum lugar que desencadeia um comportamento especial, como anular o terminal (e fazer com que pareça que nada foi impresso) ou alterar a cor de primeiro plano (e tornar toda a saída subsequente invisível).

Assumirei que nos dois computadores diferentes em que você estava testando, você usou emuladores de terminal diferentes, o que explicaria os diferentes comportamentos que você estava vendo: nem todos os TEs reconhecem todos os códigos de escape, pois alguns implementam códigos privados. seqüências para alguns comportamentos exclusivos (como o protocolo de exibição de imagem raster de kitty ).

¹) Existem alguns sinalizadores para cat , como -t sugerido nos comentários, que o manipulam antes de imprimi-los. Veja man cat para mais informações.

O que você pode fazer

Às vezes, você pode querer ou precisar examinar os bytes reais em um arquivo. Nessas situações, você deve usar um software especializado chamado editor hexadecimal, que exibe a representação hexadecimal de cada byte no arquivo, tornando assim seguro imprimir em um terminal.

Para fins de visualização simples, você também pode usar o programa xxd , que pode ser enviado com vim ou autônomo (dependendo da sua distribuição).

Você pode extrair os vários textos que podem estar presentes em qualquer arquivo binário usando strings , que está incluído em binutils na maioria das distros. (Obrigado ao @Rui F Ribeiro por apontar)

    
por 04.11.2018 / 06:27
1

Um arquivo pcap é gerado pela biblioteca libpcap. Não é um arquivo de texto. É um arquivo em um formato raw especial que é um despejo de tráfego de rede.

O comando tcpdump entende esse formato.

Para ver os cabeçalhos do tráfego TCP / IP, faça o seguinte:

tcpdump -r cap.pcap -n

Para ver o tráfego capturado também:

tcpdump -r cap.pcap -n -s 1500 -X
    
por 04.11.2018 / 03:11

Tags