微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过ssh或telnet将terminal大小更改发送到命令行应用程序?

terminal大小变化如何通过ssh或telnet发送到命令行应用程序?

用户使用ssh或telnet连接到远程计算机。

他们开始在VIM中编辑文档。

然后他们调整他们的terminal窗口。

Java邮件客户端不能在Linux上工作

linux:search最近修改的* .PHP文件

数据报套接字中的单播源地址过滤

一个文件中search一个string,如果匹配,用同一个stringreplace同一行中的另一个string

Eclipse CDT:Symbol'cout','map','vector','size_t'等无法parsing

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

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

sshd / telnetd然后告诉应用程序terminal大小已经改变。 这是如何完成的。 这是从terminal到SSH / Telnet的方法相同吗?

在Linux中使用笔记本电脑的光线传感器

innobackupex – 恢复MysqL备份后,服务器无法启动

SIGSTOP如何在Linux内核中工作?

使用除bash之外的shell作为认shell的SFTP访问服务器

为什么不调用“轮询”在sysfs设备属性文件上正确的阻塞?

这是伪终端的混乱世界。

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

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

使用posix_openpt (或openpty )打开主psedoterminal设备

一个新的孩子(通常这是必然成为一个壳)

使用setsid()来终止它的终端连接

打开成为其控制终端的终端设备(在步骤1中创建)

用步骤4中的fd替换标准描述符( STDIN_FILENO和朋友)

在这一点上,任何服务器进程写入主端的结束作为输入到从端端终端线的纪律,所以内核做一些魔术 – 如发送信号 – 编写某些组合时,你也可以发出ioctl调用有用的效果

想想这个最好的方法就是去探索openssh套件。

客户端监控SIGWINCH – 请参阅clientloop.c并在received_window_change_signal = 1时设置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与接收的大小,这真正的魔术:

struct winsize w; w.ws_row = row; ... (void) ioctl(ptyfd,TIOCSWINSZ,&w); /* This is it! */

这将设置从站的新窗口大小。 如果新的大小与旧的大小不同,则内核与该pty关联前台进程组发送SIGWINCH 。 因此vim也可以获得这个信号,并且可以更新它的终端大小的想法。

调整终端窗口的大小会生成一个SIGWINCH信号。

另请参阅相关的glibc文档 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐