fad*_*bee 7 linux vim ssh terminal telnet
如何通过ssh或telnet将终端大小更改发送到命令行应用程序?
用户使用ssh或telnet连接到远程计算机.
他们开始在VIM中编辑文档.
然后他们调整终端窗口的大小.
终端必须告诉ssh/telnet窗口大小已经改变.这是怎么发生的?
然后ssh/telnet使用它自己的特定方法将该更改发送到sshd/telnetd.这些方法是什么?
然后sshd/telnetd告诉应用程序终端大小已经改变.怎么做 它是从终端到ssh/telnet的方法吗?
cni*_*tar 11
这是伪终端的凌乱世界.
在本地,当您调整终端的大小时,前台进程组会获得一个SIGWINCH,您可以使用它ioctl来获取新的大小.但是这与远程 vim进程有什么关系呢?
主题非常复杂,但它的要点是删除服务器(sshd)执行此操作:
posix_openpt(或openpty)打开主psedoterminal设备setsid()STDIN_FILENO用步骤4中的fd 替换标准描述符(和朋友)此时,服务器进程写入主端的任何内容最终都作为输入到从属端BUT 并具有终端线规则,因此内核在编写某些组合时会发出一些魔术 - 比如发送信号 - 并且您还可以发出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);
...
Run Code Online (Sandbox Code Playgroud)所以现在服务器应该接收一个指定(可能是新的)大小的数据包.
服务器pty_change_window_size使用收到的大小调用真正的魔法:
struct winsize w;
w.ws_row = row;
...
(void) ioctl(ptyfd, TIOCSWINSZ, &w); /* This is it! */
Run Code Online (Sandbox Code Playgroud)这将设置从站的新窗口大小.如果新大小与旧大小不同,则内核将a发送SIGWINCH到与该pty关联的前台进程组.因此vim也获得该信号并且可以更新其终端大小的想法.
| 归档时间: |
|
| 查看次数: |
2147 次 |
| 最近记录: |