当通过 ssh 检索二进制文件时,是什么导致 \r 被插入到 \n 之前,以及如何规避它?

当通过 ssh 检索二进制文件时,是什么导致 \r 被插入到 \n 之前,以及如何规避它?

我继承了一台 Ubuntu 14.04 生产服务器,需要升级到 20.04,并且我想要一个沙盒版本来首先进行试验,因此我想dump通过restore网络从 MacOS 或另一个 14.04 virtualbox 实例连接文件系统。这个问题的早期版本位于https://askubuntu.com/q/1314747/963

服务器无法“看到”我的机器,因此我无法轻松运行 dump 并将结果远程推送到我的机器,但需要从我的机器调用 ssh 来运行 dump。

ssh -t me@there "echo MYPASSWORD | sudo -S dump -y -f - /boot 2>/dev/null " > boot.dump 

\r问题是我发现运行此命令会在字符前面插入很多字符\n,这会破坏转储文件,因此restore无法使用它。我知道这可能是由于驱动程序将换行符转换为打印所需的字符,但我不知道这是在哪里触发的。

我应该如何执行此操作才能获得正确的二进制转储文件?

答案1

这是ONLCR .c_oflagtermios 设置导致换行符 ( ) 被远程计算机上分配的伪终端\n转换为回车/换行符 ( ) (因为 ssh 的选项)。\r\nssh-t

使用以下命令将其关闭stty -onlcr

ssh -t me@there 'stty -onlcr; ...' > output

答案2

官方的 ASCII 行结束是CR LF(即,返回到行开头并转到下一行,\r\n在 C 语言中)。为了减少每行一个字节(当你的内存以 KiB 为单位并且磁盘为几百 MiB 时非常重要),Unix 只是用来\n标记行结束。一些系统(特别是微软)做过遵循标准,因此在系统之间移动文本文件时,有时您手头有翻译任务。

相关内容