gnr*_*gnr 1 unix linux ssh shell pty
这是一个让我发疯的问题,我想不出解决办法。我的程序:
#!/usr/bin/sh
ssh -t myuser@anotherhost "cat ~/severalLineFile"
Run Code Online (Sandbox Code Playgroud)
和~/severalLineFile
上anotherhost
看起来像:
line1
line2
line3
line4
line5
line6
Run Code Online (Sandbox Code Playgroud)
当我自己运行我的程序时,终端的输出看起来像预期的那样。但是,当调整我的终端大小使其只有 5 行,并将我的程序通过管道减少时,它看起来像:
line1
line2
line3
line4
:
Run Code Online (Sandbox Code Playgroud)
并且在那时按下空格键时,它会打印出line5
和line6
(以及任何其他行),例如:
line5
line6
Run Code Online (Sandbox Code Playgroud)
现在我明白这是在伪终端中运行 ssh 的结果,并且这种阶梯式的发生是因为换行符中包含回车符。我试过使用,stty ocrnl
但这并没有达到我想要的效果,即在我按下空格键后, less 的初始打印表现得像所有东西。
顺便说一句,我需要ssh
在-t
模式下运行,因为我希望所有ctrl+C
键盘中断都能进入远程进程。如果在这方面有解决方案,我全神贯注。我在 Linux Server 6.1 上,终端是通过 Mac OS 10.6.8
我还尝试\r\n
将伪终端生成的 替换为\n
,但这并不能解决问题。
小智 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
Run Code Online (Sandbox Code Playgroud)
如果您希望ctrl+C
键盘中断传播到远程进程,您可以通过命名管道尝试“EOF 到 SIGHUP”转换器(请参阅:ssh 命令在 ssh 终止后意外在其他系统上继续;要杀死整个远程 shell,请使用:kill -HUP -- -$$
)。