求助 ssh -t 这个效果是如何实现的

2022-06-09 15:10:49 +08:00
 hzjseasea

ssh user@ip -t command 能够将远程机器上的内容动态的渲染到本地,请问下有大佬知道这种方式是如何实现的吗

我之前有想过另外一种交互的形式,就是远程的机器上构建一个 server 端, 本地构建一个 client 端, 两遍建立一个长链接,server 端负责接收 client 发送过来的内容,解析后执行,将执行的结果发回给 client 然后就卡住了, 返回的结果无法解析成正常的命令行返回的内容

2228 次点击
所在节点    Go 编程语言
10 条回复
qW7bo2FbzbC0
2022-06-09 15:48:43 +08:00
同好奇
joesonw
2022-06-09 15:55:02 +08:00
gliderlabs/ssh
heiher
2022-06-09 16:01:56 +08:00
没什么神奇的,就是在远端强制分配 pseudo-terminal ,有 terminal 才能正确处理控制字符,需要 terminal 的程序才能正确跑起来,处理后的字节流再传输到本地的终端上显示出来。

我这有个精简的实现可以大概展示相关的 API 调用:
https://github.com/heiher/hev-fsh/blob/master/src/hev-fsh-client-term-accept.c#L49-L109
https://github.com/heiher/hev-fsh/blob/master/src/hev-fsh-client-term-connect.c#L57-L81
binhb
2022-06-09 16:05:31 +08:00
server 端需要返回 pty (虚拟终端), 才可以正常交互
在 node 中 server 端可以使用 node-pty ,前端可以使用 xterm
hzjseasea
2022-06-09 17:32:36 +08:00
@binhb 感谢有思路了
hzjseasea
2022-06-09 17:33:07 +08:00
@heiher 感谢
hzjseasea
2022-06-09 17:33:34 +08:00
@joesonw 感谢,我去看了下 go-pty 已经解决了
eudore
2022-06-10 08:40:13 +08:00
-t 可能是 tty ,ssh 使用 x11 技术实现图像转发。

xshell 连接 ssh 一般依次发送 x11 pty env shell 请求,sshd 接受 x11 请求会调用 xauth ( xauth list 可以查当然客户端)注册 x11 客户端信息,启动一个 x11 转发端口 6010+x ,如果运行一个带 ui 程序(例如 xclock ),ui 会使用 DISPLAY 环境变量拿到 x11 转发端口,将 ui 数据渲染到端口内,经过 ssh x11 转发到 ssh 客户端上,由 ssh 客户端启动一个窗口显示远程服务器上的 x11 ui 。
cctv1005s927
2022-06-10 15:15:48 +08:00
然后就卡住了?

如果是流的形式的话不应该卡主的啊,就和正常的 web tty 应该是一样的,在协程执行命令读取命令的 stdout 和 stderr ,应该是能正常传输的才对的
julyclyde
2022-06-13 15:01:00 +08:00
@eudore 跟 x11 没什么关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/858436

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX