Centos

防止通過 SSH 了解終端大小更改的程序的終端更改大小

  • May 29, 2020

我們通過 SSH 使用基於文本的程序。會話由登錄腳本啟動,該腳本進行一些設置,然後在沒有 shell 的情況下啟動程序。它在膩子中效果很好。我們正在嘗試將它與移動 SSH 客戶端一起使用,例如termius

問題在於 xHarbour 程序可以辨識終端更改,例如旋轉螢幕或關閉鍵盤。因此,如果終端調整大小,xHarbour 程序會知道它並更改控制台大小。

stty x rows y columns可以設置初始終端大小。

我嘗試在程序啟動之前將這些命令放入 init 腳本中,但是如果客戶端的螢幕尺寸發生變化(關閉鍵盤、旋轉螢幕),它會再次自動更改值並弄亂輸出。我還使用shopt -u checkwinsize了 ,它會影響 shell,使終端看起來好像具有固定大小,但對 xHarbour 程序沒有影響。

有沒有辦法阻止 SSH 會話接收此處描述的帶內命令?據我所知,我無法在 termius 中設置終端大小。是否有允許這樣做的android(也可能是iOS)客戶端?

目標系統是 Centos 6,7

在 Linux 和 BSD 系統上,當終端更改大小時,附加到該終端的一個或多個程序會收到一個SIGWINCH. 預設行為是忽略此信號,但進行螢幕繪製的程序,包括使用 ncurses 的程序,會擷取此信號並相應地調整顯示。

通過 SSH 發送的消息會導致調整終端的大小,從而調整您的程序接收 SIGWINCH。OpenSSH 沒有提供控制這些的方法,因為這是擁有功能齊全的終端仿真的一部分,並且允許人們選擇他們想要執行的終端的哪些部分,這會導致程序環境極其困難。但是,如果您不希望您的程序有終端,您可以通過 SSH 使用該-T選項呼叫它,然後它不會。它也沒有重繪螢幕的能力,因為它沒有設置終端或終端類型。不過,這可能是您正在尋找的行為。

如果您真的不想重繪螢幕,您可以嘗試從忽略SIGWINCH. 看起來某些版本的 ncurses 確實尊重這一點。您還可以使用一個為其提供自己的 pty 並將其轉發到原始終端的程序來包裝您的程序。不過,那將非常複雜。

但是,總的來說,這似乎不是您通常想要的行為。程序應該響應終端,這通常是被認為是可取的標準 Unix 行為。如果你確實讓這個工作,你可能最終會得到很多損壞的渲染,並且通常對結果不滿意。

引用自:https://unix.stackexchange.com/questions/589827