如何跟踪远程二进制文件?

问题描述 投票:0回答:2

我正在寻找一种将 Kubernetes pod 上的二进制文件流式传输(“尾部”)到我的本地计算机的方法。

我试过这个:

kubectl exec -it app-service-58697cf7c9-nnzgh -c tcpdumper -- tail -f -c +0 /output.pcap

tcpdumper
只是
tcpdump
的薄包装,它作为 Pod 中的辅助容器运行)。

几乎有效。当我运行此命令时,我可以在本地计算机上查看二进制数据流。

我在这里尝试做的最终目标是,我想获取 pcap 数据的二进制流并将其通过管道传输到我的计算机上运行的 Wireshark。这是行不通的,因为数据并不完全是 Pod 上写入的数据。

相关的不是 Kubernetes,也不是数据包捕获。问题似乎在于我如何使用

tail
传输这些数据;当我以这种方式执行此操作时,
tail
似乎添加了换行符。我认为这是因为
tail
不打算处理二进制数据。

如果我直接在 pod 上运行

tcpdump
,将其写入那里的 .pcap 文件,然后使用
kubectl cp
传输该文件,然后将该文件加载到 Wireshark 中,它就可以工作,我可以查看网络流量。我可以使用十六进制编辑器看到此方法与上面的
tail
方法之间的区别在于,经常会出现无关的字符(“0xD”,即换行符)。

有什么想法吗?

kubernetes binary-data tail
2个回答
2
投票

我不确定是什么导致 tail 随机插入换行符,我无法重现您的问题,但我确实有几个想法:

1:在服务器上写入文件时对文件进行 Base64 编码,并在本地计算机上读取文件时对文件进行 Base64 解码。

2:不要写入文件,而是尝试写入 fifo (mkfifo),您可以简单地对其进行cat,而不是拖尾。

如果不更好地了解您的情况,我无法真正明智地谈论这些是否适用于您的情况,但认为它们值得一提。


0
投票

我发现问题与

kubectl
输出有关,而不是
tail
本身添加换行符。

kubectl exec -it [pod_name] -c [container] -- bash -c "/usr/sbin/tcpdump -n -w - 2>/dev/null" | LC_ALL=C tr -d '\n' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i - 

这里一些主要组件的简短说明:

  1. /usr/sbin/tcpdump -n -w - 2>/dev/null
    :写入标准输出,但抑制 tcpdump 控制台输出,这会干扰流式传输到wireshark。
  2. LC_ALL=C tr -d '\n'
    ,删除换行符并使用 C 语言环境,以便我们可以对二进制流进行操作。
  3. /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -
    :打开wireshark (macOS) 并立即开始从stdout 进行捕获。
© www.soinside.com 2019 - 2024. All rights reserved.