使用pty(通过ssh)和管道到更多时的阶梯式步进

时间:2012-05-07 14:05:37

标签: linux shell unix ssh pty

这是一个让我疯狂的问题,我无法找到解决方案。我的节目:

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

~/severalLineFile上的anotherhost看起来像是:

line1
line2
line3
line4
line5
line6

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

line1
     line2
          line3
               line4
                    :

当按下空格键时,会打印出line5line6(和任何其他行),如:

line5
line6

现在我明白这是在伪终端中运行ssh的结果,并且这个阶梯式步骤发生是因为换行符包含在换行符中。我已经尝试过使用stty ocrnl,但这并没有按照我想要的方式进行,也就是说,按下空格键后,初始打印的内容就像所有内容一样。

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

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

2 个答案:

答案 0 :(得分:4)

要删除额外的回车符,您必须使用stty -onlcr,而不是stty onlcr(请参阅:Extra Carriage Return on Each Printed Line)。

如果您首先将ssh命令的输出传送到cat -v然后传送到less会怎样?

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

如果您希望ctrl+C键盘中断传播到远程进程,您可以通过命名管道尝试“EOF to SIGHUP”转换器(请参阅:ssh command unexpectedly continues on other system after ssh terminates;以杀死整个遥控器shell使用:kill -HUP -- -$$)。

答案 1 :(得分:0)

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

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

OR

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

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

scp myuser@anotherhost:severalLineFile /dev/stdout