防止通过 SSH 了解终端大小变化的程序改变终端大小

防止通过 SSH 了解终端大小变化的程序改变终端大小

我们通过 SSH 使用基于文本的程序。该会话通过登录脚本启动,该脚本会进行一些设置,然后在没有 shell 的情况下启动程序。它在腻子中效果很好。我们正在尝试将它与移动 SSH 客户端一起使用,例如特米乌斯

问题在于 xHarbour 程序可以识别终端更改,例如旋转屏幕或关闭键盘。因此,如果调整终端大小,xHarbour 程序就会知道并更改控制台大小。

使用stty x rows y columns我可以设置初始终端大小。

我尝试在程序启动之前将这些命令放入 init 脚本中,但是如果客户端的屏幕尺寸发生变化(关闭键盘、旋转屏幕),它会再次自动更改值并弄乱输出。我还使用了shopt -u checkwinsize,它会影响 shell,使终端看起来好像有固定大小,但对 xHarbour 程序没有影响。

有没有办法阻止 SSH 会话接收所述带内命令这里?据我所知,我无法在 termius 中设置终端大小。是否有 Android(也许还有 iOS)客户端允许这样做?

目标系统是Centos 6,7

答案1

在 Linux 和 BSD 系统上,当终端更改大小时,附加到该终端的一个或多个进程会收到一个SIGWINCH.默认行为是忽略此信号,但进行屏幕绘制的进程(包括使用 ncurses 的程序)会捕获此信号并相应地调整显示。

通过 SSH 发送的消息会导致终端的大小发生调整,从而导致您的进程接收 SIGWINCH。 OpenSSH 没有提供控制这些的方法,因为这是功能齐全的终端模拟的一部分,并允许人们挑选和选择他们想要运行的终端部分,这会导致程序环境变得极其困难。但是,如果您不希望进程有终端,您可以使用选项通过 SSH 调用它-T,然后它就不会。它也无法重绘屏幕,因为它没有终端或终端类型集。不过,这可能是您正在寻找的行为。

如果您确实不想重绘屏幕,您可以尝试从忽略SIGWINCH.看起来 ncurses 的某些版本确实尊重这一点。您还可以用一个进程来包装您的进程,为其提供自己的 pty,然后将其转发到原始终端。不过,那会非常复杂。

然而,总的来说,这似乎不是您通常想要的行为。程序应该对终端做出响应,这通常是被认为是理想的标准 Unix 行为。如果你确实让它工作,你可能会得到很多损坏的渲染,并且通常对结果不满意。

相关内容