如何通过 ssh 跟踪二进制文件?
How to tail a binary file over ssh?
我在远程机器上有一个自定义二进制格式的日志文件。我想将它与我本地机器上的文件同步,所以当新字节附加到远程二进制文件时,我本地机器上的文件也会更新。
我在这里了解了如何通过 ssh 使用 tail
:https://serverfault.com/questions/608723/tail-a-file-from-ssh-and-mirror-to-a-local-file
然后我在这里了解了如何在二进制文件上使用 tail
:Binary "tail" a file
我试着把它们组合成
ssh -t remotebox "tail -c +1 -f /path/to/file.bin" > ./mirror.bin
但后来我意识到 mirror.bin
已损坏。查看十六进制转储,我看到所有 0d0a
字节都被 t运行 分类到 0a
中(\r\n
仅被 \n
替换)。然而,如果我 运行 在本地尾巴 (tail -c +1 -f file1.bin > file2.bin
),这个 t运行cation 不会发生。
我也试过用tee
代替重定向;问题依然存在。
是否有 shell 我可以使用 tail 来防止这种情况发生的技巧,或者是否有其他程序可以满足我的需要?
谢谢。
P.S。远程和本地机器都是Linux, 运行ning bash.
以下重现了问题:
$ 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
.
我在远程机器上有一个自定义二进制格式的日志文件。我想将它与我本地机器上的文件同步,所以当新字节附加到远程二进制文件时,我本地机器上的文件也会更新。
我在这里了解了如何通过 ssh 使用 tail
:https://serverfault.com/questions/608723/tail-a-file-from-ssh-and-mirror-to-a-local-file
然后我在这里了解了如何在二进制文件上使用 tail
:Binary "tail" a file
我试着把它们组合成
ssh -t remotebox "tail -c +1 -f /path/to/file.bin" > ./mirror.bin
但后来我意识到 mirror.bin
已损坏。查看十六进制转储,我看到所有 0d0a
字节都被 t运行 分类到 0a
中(\r\n
仅被 \n
替换)。然而,如果我 运行 在本地尾巴 (tail -c +1 -f file1.bin > file2.bin
),这个 t运行cation 不会发生。
我也试过用tee
代替重定向;问题依然存在。
是否有 shell 我可以使用 tail 来防止这种情况发生的技巧,或者是否有其他程序可以满足我的需要?
谢谢。
P.S。远程和本地机器都是Linux, 运行ning bash.
以下重现了问题:
$ 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
.