【问题标题】:How to tail a binary file over ssh? [closed]如何通过 ssh 跟踪二进制文件? [关闭]
【发布时间】:2021-03-02 08:53:32
【问题描述】:

我在远程机器上有一个自定义二进制格式的日志文件。我想将它与我本地机器上的文件同步,所以当新字节附加到远程二进制文件时,我本地机器上的文件也会更新。

我在这里了解了如何通过 ssh 使用 tailhttps://serverfault.com/questions/608723/tail-a-file-from-ssh-and-mirror-to-a-local-file

然后我在这里了解了如何在二进制文件上使用tailBinary "tail" a file

我尝试将它们组合成

ssh -t remotebox "tail -c +1 -f /path/to/file.bin" > ./mirror.bin

但后来我意识到mirror.bin 已损坏。查看十六进制转储,我看到所有0d0a 字节都被截断为0as(\r\n\n 替换)。但是,如果我在本地运行 tail (tail -c +1 -f file1.bin > file2.bin),则不会发生这种截断。

我也尝试使用tee 代替重定向;问题依然存在。

是否有我可以使用 tail 执行的 shell 技巧来防止这种情况发生,或者是否有其他程序可以满足我的需求?

谢谢。

附:远程和本地机器都是 Linux,运行 bash。

【问题讨论】:

  • 是否有两个不同的系统涉及不同的行尾(例如 Linux 和 Windows)?
  • @ThomasSablik 不,两者都是 Linux。我已将其添加到说明中。
  • 你应该在 Serverfault 或 Unix/Linux 上问这个问题。与编程无关。
  • 我认为问题在于tailtee 专注于文本。因此行尾被转换。如果有二进制选项,您可以查看文档。
  • @ThomasSablik 感谢您的建议,我已经在 Unix/Linux 上发布了这个问题。问题是本地机器上的tail没有这个问题,所以我怀疑SSH中的某些东西是罪魁祸首。

标签: linux bash tail


【解决方案1】:

以下重现问题:

$ echo -e '123\r\n234\r\n' > /tmp/1
$ scp /tmp/1 server:/tmp/1
$ ssh -t server cat /tmp/1 > /tmp/2
Shared connection to closed.
$ diff /tmp/1 /tmp/2
1,3c1,3
< 123
< 234
< 
---
> 123
> 234
> 

ssh -t 有可能将\r\n 更改为\n,因为它可能会在线上执行stty +igncr。我的ssh -t 则相反(我认为stty +inlcr),我的角色翻了一番:

$ ssh -t server cat /tmp/1 | hexdump -C
Shared connection to  closed.
00000000  31 32 33 0d 0d 0a 32 33  34 0d 0d 0a 0d 0a        |123...234.....|
0000000e
$ ssh server cat /tmp/1 | hexdump -C
00000000  31 32 33 0d 0a 32 33 34  0d 0a 0a                 |123..234...|
0000000b

无论如何。如果您不打算使用终端功能,请删除 -t 选项。

你的命令行提示你正在复制一个文件。我不知道你为什么要使用tail - tail 它用于输出文件的最后一部分,而不是用于打印整个文件...要打印整个文件,请使用cat。要复制文件,请使用scp

【讨论】:

  • 我使用tail的原因是远程文件不断被追加,我想尽快在本地机器上获取新内容。由于它是一个日志文件,tail 似乎比重新运行 rsync 执行得更好。
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多