1

这是一个让我发疯的问题,我无法找到解决方案。我的程序:

#!/usr/bin/sh
ssh -t myuser@anotherhost "cat ~/severalLineFile"

并且看起来像~/severalLineFileanotherhost

line1
line2
line3
line4
line5
line6

当我自己运行我的程序时,我的终端的输出看起来像预期的那样。但是,当调整我的终端大小使其只有 5 行,并将我的程序通过管道传输到更少时,它看起来像:

line1
     line2
          line3
               line4
                    :

并且在该点按空格键时,它会打印出line5line6(以及任何其他行),例如:

line5
line6

现在我明白这是在伪终端中运行 ssh 的结果,并且由于回车符包含在换行符中而发生这种阶梯式。我已经尝试过使用stty ocrnl,但这并没有达到我想要的效果,即在我按下空格键后,最初打印的 less 表现得像所有东西一样。

顺便说一句,我需要ssh-t模式下运行,因为我希望所有ctrl+C键盘中断都能进入远程进程。如果在这方面有解决方案,我会全力以赴。我在 Linux Server 6.1 上,终端是通过 Mac OS 10.6.8

我也尝试用 替换\r\n伪终端生成的\n,但这并不能解决问题。

4

2 回答 2

5

要删除您必须使用的额外回车符stty -onlcr,而不是stty onlcr(请参阅:每个打印行上的额外回车符)。

如果您先将ssh命令的输出通过管道传输到cat -v然后再传输到,会发生less什么?

ssh -t localhost "stty -echo -onlcr; cat testfile.txt; stty echo onlcr" | cat -v | less -U

如果您希望ctrl+C键盘中断传播到远程进程,您可以通过命名管道尝试“EOF 到 SIGHUP”转换器(请参阅:ssh 命令在 ssh 终止后意外在其他系统上继续;杀死整个远程 shell 使用:kill -HUP -- -$$)。

于 2014-02-13T16:04:59.317 回答
0

您的问题是 EOL 标记;MacOS 使用 CR ( \raka \x0d) 字符,Linux 使用 LF ( \naka \x0a)。由于支持终端绘图字符(如 CR),ssh 将它们解释为在屏幕上移动光标的字符,而不是 EOL 标记。尝试这个:

ssh -t myuser@anotherhost "sed -e 's,\\r,\\n,' ~/severalLineFile"

或者

ssh -t myuser@anotherhost "tr '\\r' '\\n' < ~/severalLineFile"

如果这不起作用,您可以使用scp将文件复制到终端:

scp myuser@anotherhost:severalLineFile /dev/stdout
于 2012-05-07T15:01:59.093 回答