0

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

  1. 从 Windows 打开一个腻子终端
  2. 更改 Session->Logging 设置并选择 SSH Packets,同时浏览到保存 putty.log 文件的位置
  3. 设置您的 IP 地址并连接到 Linux 机器
  4. 登录后,发出以下命令 printf "abc\6\n",该字符串包含一个 ack 字符
  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 打开一个腻子终端
  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 类型的终端一致的响应。

4

1 回答 1

0

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

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

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

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

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

于 2020-09-15T17:37:27.403 回答