V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hzjseasea
V2EX  ›  Go 编程语言

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

  •  
  •   hzjseasea · 2022-06-09 15:10:49 +08:00 · 2188 次点击
    这是一个创建于 658 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    10 条回复    2022-06-13 15:01:00 +08:00
    qW7bo2FbzbC0
        1
    qW7bo2FbzbC0  
       2022-06-09 15:48:43 +08:00
    同好奇
    joesonw
        2
    joesonw  
       2022-06-09 15:55:02 +08:00 via iPhone
    gliderlabs/ssh
    heiher
        3
    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
        4
    binhb  
       2022-06-09 16:05:31 +08:00
    server 端需要返回 pty (虚拟终端), 才可以正常交互
    在 node 中 server 端可以使用 node-pty ,前端可以使用 xterm
    hzjseasea
        5
    hzjseasea  
    OP
       2022-06-09 17:32:36 +08:00
    @binhb 感谢有思路了
    hzjseasea
        6
    hzjseasea  
    OP
       2022-06-09 17:33:07 +08:00
    @heiher 感谢
    hzjseasea
        7
    hzjseasea  
    OP
       2022-06-09 17:33:34 +08:00
    @joesonw 感谢,我去看了下 go-pty 已经解决了
    eudore
        8
    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
        9
    cctv1005s927  
       2022-06-10 15:15:48 +08:00
    然后就卡住了?

    如果是流的形式的话不应该卡主的啊,就和正常的 web tty 应该是一样的,在协程执行命令读取命令的 stdout 和 stderr ,应该是能正常传输的才对的
    julyclyde
        10
    julyclyde  
       2022-06-13 15:01:00 +08:00
    @eudore 跟 x11 没什么关系
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   993 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:51 · PVG 03:51 · LAX 12:51 · JFK 15:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.