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

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

概述如何通过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文档 。

总结

以上是内存溢出为你收集整理的如何通过ssh或telnet将terminal大小更改发送到命令行应用程序?全部内容,希望文章能够帮你解决如何通过ssh或telnet将terminal大小更改发送到命令行应用程序?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1244299.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存