简短回答

简短回答

我有一个生成文件(cap.pcap)的Python脚本。当我对其执行 cat 时,它会永远卡住(不显示任何内容)。我尝试运行:

  1. 命令文件 hd 和 vi。它们工作正常。
  2. lsof 和 fusioner,它们什么也没显示。
  3. cp 到另一个文件并 cat 后者。它被卡住了。
  4. dd 到另一个文件,结果相同。
  5. < base64 cap.pcap > b64; < base64 -d b64 > cap2.pcap; cat cap2.pcap;它又被卡住了。
  6. 将base64内容发送到另一台机器上进行测试;它工作正常。

另外,当我在任何其他文件上执行 cat 时:它有效。

版本:

  • 乌班图18.04.1
  • 猫(GNU coreutils)8.28

为了以防万一它可能有帮助,以下 python 脚本的部分负责此操作:

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()

答案1

简短回答

  1. 你几乎总是可以认为这不是cat他的错;这是他的错。它太过普遍、经过充分测试且简单,不会出现如此大而明显的错误。
  2. 不要只是将cat二进制文件发送到您的终端;终端设计用于显示文本,而不是任意二进制数据。

长答案

被卡住的不是cat进程本身,而是终端仿真器,即显示窗口的程序。cat它本身并不关心文件中的实际内容,它所做的只是将文件中的所有内容复制到其标准输出1。您可以(理论上)cat /dev/sda并且它会很乐意将您的整个硬盘内容转储到您的终端上。

然而,终端仿真器并非旨在显示任何任意二进制数据。它们用于显示文本,并且可以通过在其中嵌入特殊的不可打印字符序列(称为控制代码或转义码,因为大多数都以“转义字符”开头(\x1B,通常显示为^[)。

现在,如果您将二进制数据转储到终端上,它可能会看到转义字符(或任何其他对其特殊的字符),并尝试从中解释转义代码。这意味着它不会显示以下字符,至少在它可以确定它们是否实际上形成有效序列之前是这样。另一种可能性是,在某处嵌入了一个有效序列,该序列会触发特殊行为,例如清空终端(并使其看起来根本没有打印任何内容),或更改前景色(并使所有后续输出不可见)。

我假设在您测试的两台不同计算机上,您使用了不同的终端仿真器,这可以解释您所看到的不同行为:并非所有 TE 都能识别所有转义码,因为有些为某些实现私有的非标准序列独特的行为(如kitty光栅图像显示协议)。

1) 有一些标志cat,例如-t注释中建议的标志,可以使其在输出文件内容之前对其进行操作。请参阅man cat获取更多信息。

你可以做什么

有时您可能想要或需要查看文件中的实际字节。在这些情况下,您应该使用称为十六进制编辑器的专用软件,它显示文件中每个字节的十六进制表示形式,从而可以安全地在终端上打印。

为了简单的查看目的,您还可以使用该xxd程序,该程序可能附带vim或独立(取决于您的发行版)。

您可以使用大多数发行版strings中包含的 来提取任何二进制文件中可能存在的各种文本。 binutils(感谢@Rui F Ribeiro 指出)

答案2

pcap 文件由 libpcap 库生成。它不是一个文本文件。它是一种特殊原始格式的文件,是网络流量的转储。

命令 tcpdump 理解这种格式。

要查看 tcp/ip 流量的标头,请执行以下操作:

tcpdump -r cap.pcap -n

要查看捕获的流量:

tcpdump -r cap.pcap -n -s 1500 -X

相关内容