首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >终端大小的更改是如何通过ssh或telnet发送到命令行应用程序的?

终端大小的更改是如何通过ssh或telnet发送到命令行应用程序的?
EN

Stack Overflow用户
提问于 2013-10-03 10:48:33
回答 2查看 3.3K关注 0票数 10

终端大小的更改是如何通过ssh或telnet发送到命令行应用程序的?

  1. 用户使用ssh或telnet连接到远程计算机。
  2. 他们开始用VIM编辑文档。
  3. 然后他们调整终端窗口的大小。

终端必须告诉ssh/telnet窗口大小已经更改。这是怎么发生的?

然后,ssh/telnet使用自己的特定方法将更改发送到sshd/telnetd。这些方法是什么?

然后sshd/telnetd告诉应用程序终端大小已经改变。这是怎么做到的。它是否与从终端到ssh/telnet的方法相同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-03 11:32:30

这是一个混乱的假终端世界。

在本地,当您调整终端的大小时,您的前台进程组将得到一个SIGWINCH,您可以使用ioctl获取新的大小。但是这与远程 vim进程有什么关系呢?

主题相当复杂,但其要点是删除服务器(sshd)这样做:

  1. 使用posix_openpt (或openpty)打开主using终端设备
  2. 叉出一个新的子程序(通常这将成为一个shell)
  3. 使用setsid()切断其终端连接
  4. 打开终端设备(在步骤1中创建),该终端设备成为其控制终端。
  5. 将标准描述符(STDIN_FILENO和朋友)替换为步骤4中的fd

此时,服务器进程写入主端的任何内容都会以从端输入的形式结束,但是具有终端行的会约束,因此内核在编写某些组合时会执行一些神奇的操作--就像发送信号一样,您还可以发出具有有用效果的ioctl调用。

考虑这一点的最好方法是探索openssh套件。

  • 客户端监视SIGWINCH -请参阅clientloop.c,并在接收到它时设置received_window_change_signal = 1
  • 函数client_check_window_change检查标志,告诉服务器: packet_start(SSH_CMSG_WINDOW_SIZE);packet_put_int((u_int)ws.ws_row);

因此,现在服务器应该接收一个指定(可能是新的)大小的数据包。

  • 服务器使用接收到的大小调用pty_change_window_size,这就实现了真正的魔力: w.ws_row = row;.(void) ioctl(ptyfd,TIOCSWINSZ,&w);/*这是它!*/

这将设置从服务器的新窗口大小。如果新的大小与旧的不同,内核将向与该pty关联的前台进程组发送一个。因此,vim也可以获得该信号,并可以更新其终端大小的概念。

票数 17
EN

Stack Overflow用户

发布于 2013-10-03 10:55:45

调整终端窗口大小会产生SIGWINCH信号。

也请参阅相关的glibc文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19157202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档