cs01/termpair

GitHub: cs01/termpair

TermPair 通过端到端加密的浏览器界面实现远程终端的实时查看与控制,无需安装额外运行时依赖。

Stars: 1764 | Forks: 76

TermPair

View and control remote terminals from your browser with end-to-end encryption

termpair share command

termpair browser view

## 为什么选择 TermPair? * **零知识共享** —— 你的终端是端到端加密的(AES-128-GCM)。服务器是一个盲中继,永远不会看到你的数据。 * **一条命令即可共享** —— 运行 `termpair share`,发送链接。任何人都可以通过浏览器实时查看你的终端。 * **允许他人输入** —— 查看者可以从浏览器在你的终端中输入,或者设置 `--read-only` 让他们只能观看。 * **公开或私有** —— 私有会话是加密的且仅限通过链接访问。公开会话(`--public`)会列在主页上,任何人都可以发现并观看。 * **在服务器重启后依然存活** —— 如果服务器宕机,双方会自动重新连接并从中断处恢复。 * **单一二进制文件,无依赖** —— 一个静态二进制文件捆绑了服务器、客户端和 Web 前端。不需要 Node,不需要 Python,也不需要 Docker。 * **随处可用** —— Linux、macOS、Windows。共享任何终端应用:你的 shell、vim、htop、Claude Code,任何带有 TTY 的程序。 ## 安装 ### 快速安装 ``` curl -fsSL https://raw.githubusercontent.com/cs01/termpair/main/install.sh | sh ``` 安装到 `~/.local/bin`。可通过环境变量进行自定义: ``` INSTALL_DIR=/usr/local/bin sh # custom install directory VERSION=v1.2.0 sh # specific version ``` ### GitHub Releases 从 [releases 页面](https://github.com/cs01/termpair/releases)下载预构建的二进制文件。适用于 Linux(x86_64、aarch64)、macOS(x86_64、Apple Silicon)和 Windows(x86_64)。 ### 从源码构建 ``` git clone https://github.com/cs01/termpair.git cd termpair/termpair-rs cargo build --release cp target/release/termpair ~/.local/bin/ ``` ## 用法 启动服务器: ``` termpair serve ``` 共享你的终端: ``` termpair share ``` 这会打印一个包含唯一终端 ID 和加密密钥的 URL。将其分享给你想授予访问权限的人。在会话运行期间,**任何拥有此链接的人都可以访问你的终端**。 默认情况下,`termpair share` 会运行你的 `$SHELL`。服务器会将终端输出多播给所有连接的浏览器。 ## 工作原理 ``` ┌─────────────────┐ ┌─────────────────┐ │ │ encrypted terminal output │ │ │ Terminal │───────────────────────────────────▶│ Browser(s) │ │ (termpair │ ┌───────────────┐ │ (xterm.js + │ │ share) │◀────────│ Server │─────────▶│ Web Crypto) │ │ │ │ (blind relay) │ │ │ │ - forks pty │ encrypted browser input │ - decrypts │ │ - encrypts I/O │ │ never sees │ │ output │ │ - manages keys │ │ plaintext │ │ - encrypts │ │ │ └───────────────┘ │ input │ └─────────────────┘ └─────────────────┘ ``` 服务器是一个盲中继 —— 它负责路由加密的 WebSocket 消息,而无法访问密钥或明文。 终端客户端会 fork 一个 pty,使用 AES-128-GCM 加密所有输出,并解密浏览器的输入。 浏览器使用 [xterm.js](https://xtermjs.org/) + [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) 进行解密和渲染。 ### 加密 每个会话会创建三个 AES-128-GCM 密钥: 1. **输出密钥** —— 在将终端输出发送到服务器之前对其进行加密 2. **输入密钥** —— 在将浏览器输入发送到服务器之前对其进行加密 3. **引导密钥** —— 通过 [URL 哈希片段](https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement/hash)传递(永远不会发送到服务器),用于安全地交换密钥 #1 和 #2 密钥在处理 2^20 条消息后会进行轮换。IV 是单调递增的计数器,以防止重复使用。 浏览器必须处于[安全上下文](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts)(HTTPS 或 localhost)中。 ## 部署 ### NGINX ``` upstream termpair_app { server 127.0.0.1:8000; } server { server_name myserver.com; listen 443 ssl; ssl_certificate fullchain.pem; ssl_certificate_key privkey.pem; location /termpair/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://termpair_app/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ``` ### systemd ``` # /etc/systemd/system/termpair.service [Unit] Description=TermPair terminal sharing server After=network.target [Service] ExecStart=/usr/local/bin/termpair serve --port 8000 Restart=on-failure RestartSec=1s [Install] WantedBy=multi-user.target ``` ``` sudo systemctl daemon-reload sudo systemctl enable termpair.service sudo systemctl restart termpair ``` ### TLS 生成自签名证书: ``` openssl req -newkey rsa:2048 -nodes -keyout host.key -x509 -days 365 -out host.crt -batch ``` 然后将其传递给服务器: ``` termpair serve --certfile host.crt --keyfile host.key ``` ## CLI 参考 ``` $ termpair serve [OPTIONS] -p, --port port to listen on [default: 8000] --host host to bind to [default: localhost] -c, --certfile path to SSL certificate for HTTPS -k, --keyfile path to SSL private key for HTTPS $ termpair share [OPTIONS] --cmd command to run [default: $SHELL] -p, --port server port [default: 443] --host server URL [default: https://chadsmith.dev/termpair] -r, --read-only prevent browsers from typing -b, --open-browser open the share link in a browser --public public session (no encryption, read-only) ``` ## 另请参阅 **[sharemyclaude](https://github.com/cs01/sharemyclaude)** —— 与浏览器共享你的 Claude Code 会话。基于 termpair 构建,配备公共中继服务器,让你无需自托管即可立即共享。
标签:HTTP 参数枚举, Rust, SOC Prime, Web终端, 可视化界面, 开发工具, 端到端加密, 终端管理, 网络流量审计, 远程控制, 通知系统