【问题标题】:Configure a screen session to behave exactly like an xterm terminal将屏幕会话配置为与 xterm 终端完全相同
【发布时间】:2020-09-15 17:01:42
【问题描述】:

我希望能够通过 screenrc 或在会话中配置屏幕会话,使其表现得像 xterm 终端一样。目前,我有一个 c# 应用程序,它使用 ssh.net 库从 Windows 机器 ssh 到 Linux 机器,我在该机器上附加到屏幕会话并发送命令并接收回复。如果我附加到屏幕会话与我未附加到屏幕会话时相比,我会看到同一命令的两种不同类型和响应。为了演示问题,我将使用 putty 终端复制问题并记录数据。

  1. 从 windows 打开一个 putty 终端
  2. 更改 Session->Logging 设置并选择 SSH Packets,同时浏览到保存 putty.log 文件的位置
  3. 设置您的 IP 地址并连接到 Linux 机器
  4. 登录后,发出以下命令 printf "abc\6\n",此字符串包含一个确认字符
  5. 响应将打印 abc,当然它不会显示 \6,因为它不是可打印字符
  6. 打开 putty.log 文件,您将看到响应数据包数据包含 \6,这是正确的行为。
  7. 现在通过发出以下命令创建会话:screen -dmS test
  8. 通过发出以下命令附加到会话:screen -Rr test
  9. 再次发出以下命令 printf "abc\6\n"
  10. abc 将按预期打印,但如果您查看 putty.log 中的响应数据包数据,它将不再有 \6 字符
  11. 我可以通过管道命令来解决这个问题 printf "abc\6\n" | cat -v 将 \6 转换为可打印形式并在屏幕上显示 ^F,我宁愿在我的数据包数据中接收 \6,这不是一个理想的解决方案,但至少它为我的问题提供了一个解决方案。

以下是我无法解决的更严重的问题。为了演示,请执行以下操作:

  1. 从 windows 打开一个 putty 终端
  2. 更改 Session->Logging 设置并选择 SSH Packets 并浏览到保存 putty.log 文件的位置
  3. 设置您的 IP 地址并连接到 Linux 机器
  4. 登录后,通过发出以下命令更改 stty 设置(告诉终端不要用回车替换新行):stty -onlcr
  5. 然后发出命令 ls -al,
  6. putty.log 文件将包含正确的数据集,没有多余的字符。
  7. 现在通过发出以下命令创建会话:screen -dmS test
  8. 通过发出以下命令附加到会话:screen -Rr test
  9. 再次发出以下命令 stty -onlcr
  10. 再次发出 ls -al
  11. 如果您查看 putty.log 中的响应数据包数据,您会发现在收到一定数量的数据包后,响应将在每个响应的前面包含额外的字符。额外字符采用以下格式 [13C. [ 和 C 之间的数字不同。

我想让我的响应与标准 xterm 终端的行为方式相同,为什么会有差异?有没有办法配置屏幕以获得与 xterm 类型的终端一致的响应。

【问题讨论】:

标签: linux session ssh.net stty screenrc


【解决方案1】:

您要求做的事情从根本上与 screen 的做法背道而驰。

screen 是一个终端仿真器,就像xterm。它解释来自 pty 的数据流并在内部将其呈现在缓冲区中,以跟踪屏幕上的内容以及格式。

当您附加它时,screen 会合成一个新的终端指令流,以在您的特定终端上重新绘制相同的缓冲区。

它不能简单地存储和重放相同的线性流,因为这会破坏无缝多路复用和重新连接(可能来自不同的终端),这是该工具的重点。

如果您想要忠实地转储到终端的线性数据流,您可以改用script

【讨论】:

  • 感谢您的快速回复。如果我们不需要担心从不同的终端连接并且我们假设一个终端或一种类型的终端可以连接,有没有办法控制屏幕输出流的行为?设置 stty -onlcr 后,我相信我们得到的额外字符是每个响应的列位置 [6C 是第 6 列,但我不明白为什么 xterm 不会有这些额外字符,即使它打印相同的响应终端和 stty 设置设置为 stty -onlcr
  • 据我所知,screen 不支持此功能,因为它与其用途无关。使用其他工具代替或另外使用。
  • 我的目标是在连接到屏幕会话时在恢复的数据包中没有列位置。
  • 我使用 screen 的原因是在启动时启动后台命令处理器应用程序,并根据需要从外部应用程序附加和分离。稍后运行命令处理器会导致我们的 RTOS 和屏幕出现一些问题,而 tmux 似乎是通过 rc.local 启动应用程序并稍后附加到它们的一个很好的解决方案。
  • 如前所述,无论script 是否在屏幕会话中运行,您都可以从script 获取数据
猜你喜欢
  • 2016-02-15
  • 2014-03-11
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多