cs01/termpair
GitHub: cs01/termpair
TermPair 通过端到端加密的浏览器界面实现远程终端的实时查看与控制,无需安装额外运行时依赖。
Stars: 1764 | Forks: 76
View and control remote terminals from your browser with end-to-end encryption
## 为什么选择 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终端, 可视化界面, 开发工具, 端到端加密, 终端管理, 网络流量审计, 远程控制, 通知系统