【问题标题】:stair-stepping when using a pty (through ssh) and piping to more使用 pty(通过 ssh)和管道连接到更多
【发布时间】:2012-05-07 14:05:37
【问题描述】:

这是一个让我发疯的问题,我想不出解决办法。我的程序:

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

anotherhost 上的~/severalLineFile 看起来像:

line1
line2
line3
line4
line5
line6

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

line1
     line2
          line3
               line4
                    :

当此时按下空格键时,它会打印出line5line6(以及任何其他行),例如:

line5
line6

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

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

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

【问题讨论】:

    标签: linux shell unix ssh pty


    【解决方案1】:

    要删除多余的回车字符,您必须使用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 到 SIGHUP”转换器(请参阅:ssh command unexpectedly continues on other system after ssh terminates;以终止整个远程 shell 使用:@ 987654330@)。

    【讨论】:

      【解决方案2】:

      您的问题是 EOL 标记; MacOS 使用 CR (\r aka \x0d) 字符,Linux 使用 LF (\n aka \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
      

      【讨论】:

      • 自 MacOS 9 以来,MacOS 没有使用 CR 作为行尾。那是 10 年前的事了。我怀疑这个问题更多地与终端仿真和less 没有以预期的方式处理窗口大小有关。
      • 在上面添加了 MacOS 版本(10.6.8),但觉得这与终端仿真有关 - @amphetamachine,谢谢,但这些并不能解决问题 - 我试过了每个 EOL 更换变化,似乎没有任何工作。顺便说一句,不仅仅是少有这个问题,管道输送到更多也是如此。我确实喜欢 /dev/stdout 角度,但我实际上并不是在远程机器上cating 文件,而是运行进程
      • 要清楚,将我的终端窗口大小调整为 5 行的目的是,对于我的 6 行示例,less 必须在该点分页(因为我有 6 行),并且终端只有在按下空格键后才开始正确显示(即第 2 页)
      • more 只是 Mac OS X 最新版本上的 less 的硬链接,可能早在 10.4 之前。
      • 好吧,谢谢,我实际上是通过一个 linux 机器登录的,在那里我运行得更少/更多
      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      相关资源
      最近更新 更多