@zhangfengshun/dsh-remote-ssh 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -156
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,187 +1,62 @@
|
|
|
1
1
|
# @zhangfengshun/dsh-remote-ssh
|
|
2
2
|
|
|
3
|
-
类 **VSCode Remote-SSH** 的 **
|
|
3
|
+
类 **VSCode Remote-SSH** 的 **DSH** 插件:通过 SSH 连接远程超算 / 服务器,在 DSH 内置「文件」「终端」页签中直接操作远程文件和终端。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 功能特性
|
|
5
|
+
## 功能
|
|
8
6
|
|
|
9
7
|
| 能力 | 说明 |
|
|
10
8
|
| --- | --- |
|
|
11
|
-
| 🔌
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
| 🌐 远程工作区 | 选择远程目录创建**原生工作区**(本地镜像目录 + 原生注册 + 自动同步),一键打开进入远程环境 |
|
|
18
|
-
| 🤖 模型工具 | 12 个 `remote_ssh_*` 工具,模型可读写远程文件、执行远程命令、内容搜索、文件名查找、目录/删除/移动、双向同步;在远程工作区会话中免填连接参数 |
|
|
19
|
-
| 🌍 国际化 | 界面文案 + 工具描述中英双语,通过 `ctx.locale` 跟随 DSH 语言设置自动切换 |
|
|
9
|
+
| 🔌 SSH 连接 | 密钥 / 密码认证,ProxyJump 跳板机,`~/.ssh/config` 一键导入 |
|
|
10
|
+
| 📂 远程文件 | 内置「文件」页签直接 SSH 读写远程文件,无需同步 |
|
|
11
|
+
| 💻 远程终端 | 内置「终端」页签自动检测远程工作区,SSH 交互式终端 |
|
|
12
|
+
| 🌐 远程工作区 | 选择远程目录创建原生工作区,一键进入远程环境 |
|
|
13
|
+
| 🤖 模型工具 | 12 个 `remote_ssh_*` 工具,会话感知免填连接参数 |
|
|
14
|
+
| 🌍 双语 | 中英文界面 + 工具描述,跟随 DSH 语言自动切换 |
|
|
20
15
|
|
|
21
16
|
## 安装
|
|
22
17
|
|
|
23
|
-
### 本地 / 开发安装
|
|
24
|
-
|
|
25
18
|
```bash
|
|
26
|
-
dsh plugin --profile <name> add /
|
|
19
|
+
dsh plugin --profile <name> add @zhangfengshun/dsh-remote-ssh@2.0.8
|
|
27
20
|
```
|
|
28
21
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
dsh plugin --profile <name> add @zhangfengshun/dsh-remote-ssh@2.0.0
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
> ⚠️ 安装后需**重启 DSH** 才生效;后续仅修改 Client 半边时刷新浏览器即可。
|
|
36
|
-
>
|
|
37
|
-
> ⚠️ **安装顺序**:本插件会自动覆盖 `dsh-better-sidebar` 的 `shell` 配置。为确保 patch 生效(config 覆盖在 insert 之后应用),`@zhangfengshun/dsh-remote-ssh` 必须在 bundles 列表中排在 `dsh-better-sidebar` **之后**。如果先安装了 `@zhangfengshun/dsh-remote-ssh`,再安装 `dsh-better-sidebar`,需手动调整 `profile/package.json` 中 `dsh.profile.bundles` 的顺序,把 `@zhangfengshun/dsh-remote-ssh` 移到最后。
|
|
38
|
-
|
|
39
|
-
## 快速开始
|
|
40
|
-
|
|
41
|
-
1. 安装插件并重启 DSH(安装时自动配置 better-sidebar 的 shell 指向 wrapper 脚本)。
|
|
42
|
-
2. 打开 **设置 → 🖥️ 远程连接**,添加一条连接(主机 / 端口 / 用户名 / 密钥或密码),点「测试连接」验证。
|
|
43
|
-
3. 需要把远程目录当作工作区时:走 DSH 原生「添加工作区」流程,在弹窗中选择「**选择远程目录…**」→ 选择连接 → 浏览并选择远程目录。
|
|
44
|
-
4. 创建后远程文件自动同步到本地镜像,内置「文件」页签直接可见。
|
|
45
|
-
5. 在远程工作区中打开内置「终端」页签 → 自动 SSH 到远程主机(仅密钥认证)。
|
|
46
|
-
|
|
47
|
-
## 使用指南
|
|
48
|
-
|
|
49
|
-
### 1. 添加远程连接
|
|
50
|
-
|
|
51
|
-
设置 → 🖥️ 远程连接,填写:
|
|
52
|
-
|
|
53
|
-
| 字段 | 说明 |
|
|
54
|
-
| --- | --- |
|
|
55
|
-
| 名称 | 自定义显示名 |
|
|
56
|
-
| 主机 | SSH 主机名或 IP(如 `login.example.com`) |
|
|
57
|
-
| 端口 | SSH 端口,默认 `22` |
|
|
58
|
-
| 用户名 | 登录用户 |
|
|
59
|
-
| 认证方式 | `密钥`(推荐)或 `密码` |
|
|
60
|
-
| 密钥路径 / 密码 | 私钥路径(如 `~/.ssh/id_rsa`)或登录密码 |
|
|
61
|
-
| 远程根目录 | 远程默认目录,默认 `~` |
|
|
62
|
-
|
|
63
|
-
连接配置持久化在 DSH 设置命名空间 `dsh-remote-ssh` 中(密码字段 `role('secret')` 脱敏)。
|
|
64
|
-
|
|
65
|
-
### 2. 远程文件(内置「文件」页签)
|
|
66
|
-
|
|
67
|
-
- 创建远程工作区时,远程文件自动同步到本地镜像目录,内置「文件」页签直接显示;
|
|
68
|
-
- 内置编辑器编辑的是本地镜像副本,编辑后需**推送回远端**;
|
|
69
|
-
- 推送方式:设置 → 远程连接 → 远程工作区 → 点「⬆ 推送」按钮,或模型调用 `remote_ssh_push` 工具;
|
|
70
|
-
- 远程有更新时点「⬇ 同步」重新拉取。
|
|
71
|
-
|
|
72
|
-
### 3. 远程终端(内置「终端」页签)
|
|
22
|
+
> 安装后需**重启 DSH**。`@zhangfengshun/dsh-remote-ssh` 必须在 bundles 列表中排在 `dsh-better-sidebar` **之后**。
|
|
73
23
|
|
|
74
|
-
|
|
24
|
+
## 使用
|
|
75
25
|
|
|
76
|
-
|
|
26
|
+
1. **设置 → 🖥️ 远程连接** → 添加连接(主机/端口/用户/密钥)→ 点「测试连接」验证
|
|
27
|
+
2. **添加工作区** → 选「选择远程目录…」→ 选连接 → 浏览并选择远程目录
|
|
28
|
+
3. 打开内置「文件」页签 → 直接显示远程文件,编辑保存直接写回远程
|
|
29
|
+
4. 打开内置「终端」页签 → 自动 SSH 到远程主机(仅密钥认证)
|
|
77
30
|
|
|
78
|
-
|
|
79
|
-
1. 插件启动时自动在 `~/.dsh/remote-ssh/` 下生成 wrapper 脚本:
|
|
80
|
-
- `dsh-remote-shell.js`(核心逻辑:检测 `.remote-ssh.json` → `ssh -tt`;否则本地 shell)
|
|
81
|
-
- Windows: `dsh-remote-shell.cmd`(薄壳调用 .js)
|
|
82
|
-
- POSIX: `dsh-remote-shell`(薄壳调用 .js)
|
|
83
|
-
2. 安装时自动覆盖 better-sidebar 的 `shell` config 指向 wrapper 脚本。
|
|
84
|
-
3. 重启 DSH 后,在远程工作区中打开终端 → 自动 SSH 到远程主机;在本地工作区中打开终端 → 照常启动本地 shell。
|
|
85
|
-
|
|
86
|
-
> ⚠️ 终端透明接入仅支持**密钥认证**(密码无法安全传入 wrapper 脚本)。密码认证的连接仍可使用模型工具。
|
|
87
|
-
> 若需覆盖自动配置,在 profile 的 `cordis.patch.yml` 中加一条 `id: better-sidebar` 的 `config.shell` 即可(profile patch 优先于 bundle patch)。
|
|
88
|
-
|
|
89
|
-
### 4. 远程工作区(🌐)
|
|
90
|
-
|
|
91
|
-
1. 打开 DSH 原生「添加工作区」流程;
|
|
92
|
-
2. 选择「**选择远程目录…**」→ 选择连接 → 浏览并选择远程目录;
|
|
93
|
-
3. 插件在本地生成镜像目录 `~/.dsh/remote-workspaces/<id>`,写入 `.remote-ssh.json`(连接信息,供 shell wrapper 读取),自动同步远程文件,并注册进原生工作区列表(标题 `🌐 <名称>`);
|
|
94
|
-
4. 从工作区创建会话后,会话工作目录即该镜像目录,模型工具自动感知对应的远程连接与目录。
|
|
95
|
-
|
|
96
|
-
### 5. 模型工具(🤖)
|
|
97
|
-
|
|
98
|
-
插件向模型注册 5 个工具,模型可直接操作远程环境:
|
|
31
|
+
## 模型工具
|
|
99
32
|
|
|
100
33
|
| 工具 | 用途 |
|
|
101
34
|
| --- | --- |
|
|
102
|
-
| `remote_ssh_profiles` |
|
|
103
|
-
| `remote_ssh_exec` |
|
|
35
|
+
| `remote_ssh_profiles` | 列出连接配置 + 当前会话远程工作区上下文 |
|
|
36
|
+
| `remote_ssh_exec` | 执行远程命令 |
|
|
104
37
|
| `remote_ssh_ls` | 列举远程目录 |
|
|
105
|
-
| `remote_ssh_cat` |
|
|
106
|
-
| `remote_ssh_write` |
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
38
|
+
| `remote_ssh_cat` | 读取远程文件 |
|
|
39
|
+
| `remote_ssh_write` | 写入远程文件 |
|
|
40
|
+
| `remote_ssh_grep` | 搜索远程文件内容 |
|
|
41
|
+
| `remote_ssh_glob` | 查找远程文件 |
|
|
42
|
+
| `remote_ssh_mkdir` | 创建远程目录 |
|
|
43
|
+
| `remote_ssh_delete` | 删除远程文件/目录 |
|
|
44
|
+
| `remote_ssh_move` | 移动/重命名 |
|
|
45
|
+
| `remote_ssh_sync` | 远端同步到本地镜像 |
|
|
46
|
+
| `remote_ssh_push` | 本地镜像推送回远端 |
|
|
114
47
|
|
|
115
|
-
|
|
48
|
+
远程工作区会话中调用工具可免填 `profileId` 等连接参数。
|
|
116
49
|
|
|
117
|
-
##
|
|
50
|
+
## 原理
|
|
118
51
|
|
|
119
|
-
|
|
120
|
-
dsh-remote-ssh/
|
|
121
|
-
├── package.json # npm 元数据 + dsh.bundle / dsh.client 声明
|
|
122
|
-
├── cordis.patch.yml # bundle 挂载补丁(install 时加入 profile bundle 栈)
|
|
123
|
-
├── lib/
|
|
124
|
-
│ ├── index.js # Host 半边(SSH + settings + 5 个工具 + HTTP API)
|
|
125
|
-
│ └── client.js # Client 半边(better-sidebar 页签 + 设置小节 + i18n)
|
|
126
|
-
├── LICENSE
|
|
127
|
-
├── CHANGELOG.md
|
|
128
|
-
└── README.md
|
|
129
|
-
```
|
|
52
|
+
插件注册 4 个 exact 路由(`/sidebar/api/fs.tree`、`fs.read`、`fs.write`、`fs.search`),在 better-sidebar 的 prefix 路由之前拦截。会话 cwd 含 `.remote-ssh.json` 时走 SSH,否则走本地 fs。客户端看到的是本地镜像路径,Host 自动转换为远程路径——对客户端完全透明。
|
|
130
53
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
```
|
|
134
|
-
浏览器 (Client 半边) Node 进程 (Host 半边)
|
|
135
|
-
┌───────────────────────────────┐ fetch ┌──────────────────────────────────┐
|
|
136
|
-
│ ctx.betterSidebar.registerTab │ ──────▶ │ ctx.webServer /remote-ssh/api/* │
|
|
137
|
-
│ · remssh:editor (隐藏) │ ◀────── │ · SSH:listDir/readFile/… │
|
|
138
|
-
│ ctx.slots: settings.section │ JSON │ · settings:profiles/workspaces │
|
|
139
|
-
│ · 连接配置 + 工作区管理 │ │ · 自动同步 + shell wrapper 生成 │
|
|
140
|
-
│ ctx.slots: directoryFlow │ │ ctx.tools:12 个 remote_ssh_* │
|
|
141
|
-
│ · 本地 / 远程目录两选弹窗 │ └───────────────┬──────────────────┘
|
|
142
|
-
└───────────────────────────────┘ │ SSH
|
|
143
|
-
┌─────────────┴──────────┐
|
|
144
|
-
│ ~/.dsh/remote-ssh/ │
|
|
145
|
-
│ dsh-remote-shell.js │
|
|
146
|
-
│ dsh-remote-shell[.cmd]│ ← better-sidebar shell 指向此文件
|
|
147
|
-
└────────────────────────┘
|
|
148
|
-
远程超算 / 服务器
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
关键设计:
|
|
152
|
-
|
|
153
|
-
- **免 shell 引号转义**:远程命令通过 `subprocess.spawn({ argv })` 以参数数组调起 `ssh.exe`,避免引号 / 空格问题。
|
|
154
|
-
- **二进制安全读文件**:远程 `base64 -w0` 输出,Host 用 `Buffer` 解码为 UTF-8。
|
|
155
|
-
- **写文件走 stdin**:远程 `cat > <file>`,内容经子进程 stdin 传入。
|
|
156
|
-
- **文件列举**:`find -printf '%Y\t%f\t%s\n'`(`%Y` 跟随软链接取目标类型,适配超算家目录软链接)。
|
|
157
|
-
- **自动同步**:创建远程工作区时立即 `tar | ssh` 拉取远程文件到本地镜像,使内置「文件」页签可见真实远程文件。
|
|
158
|
-
- **Shell wrapper**:插件启动时生成跨平台 wrapper 脚本(Node.js + 薄壳),检测工作区 `.remote-ssh.json` 自动 SSH,使内置「终端」页签透明接入远程。
|
|
159
|
-
- **国际化**:Client 接入 `ctx.locale`,注册 `zh` / `en` 词典,界面与工具描述跟随 DSH 语言自动切换。
|
|
160
|
-
|
|
161
|
-
## 已知限制
|
|
162
|
-
|
|
163
|
-
1. **终端透明接入仅限密钥认证**:shell wrapper 通过 `.remote-ssh.json` 读取密钥路径,密码认证无法安全传入。密码认证的连接仍可使用模型工具和远程文件操作。
|
|
164
|
-
2. **文件操作依赖 GNU 工具**(`find -printf`、`base64 -w0`):目标为 Linux 超算时通用。
|
|
165
|
-
3. **密码认证需本机 `sshpass`**(Windows 默认没有);密钥认证无此依赖。
|
|
166
|
-
4. **同步为全量 tar**:`remote_ssh_sync` / `remote_ssh_push` 用 `tar` 流式全量同步,单次同步大目录耗时与传输量较高,后续可换 `rsync -e ssh` 增量。
|
|
167
|
-
5. **内置编辑器编辑的是本地镜像副本**,不会自动回传 —— 须在设置页点「推送」或调用 `remote_ssh_push` 同步回远端。
|
|
168
|
-
|
|
169
|
-
## 路线图
|
|
170
|
-
|
|
171
|
-
- [x] 从 `~/.ssh/config` 自动导入连接
|
|
172
|
-
- [x] ProxyJump / 跳板机、SSH config 复用
|
|
173
|
-
- [x] `tar`-over-ssh 双向同步(`scp` / `sftp` 增量同步为后续优化)
|
|
174
|
-
- [x] 远程文件合并到内置「文件」页签(自动同步 + 镜像)
|
|
175
|
-
- [x] 远程终端合并到内置「终端」页签(shell wrapper 透明 SSH)
|
|
176
|
-
- [ ] `rsync -e ssh` 增量同步
|
|
177
|
-
- [ ] 密码凭据走 `credentials` 服务(避免明文进 argv)
|
|
54
|
+
Shell wrapper(`~/.dsh/remote-ssh/dsh-remote-shell[.cmd]`)检测工作区 `.remote-ssh.json`,自动 `ssh -tt` 连接远程,使内置「终端」页签透明接入。
|
|
178
55
|
|
|
179
56
|
## 许可证
|
|
180
57
|
|
|
181
58
|
[MIT](./LICENSE)
|
|
182
59
|
|
|
183
|
-
---
|
|
184
|
-
|
|
185
60
|
## ❤️ 七夕快乐
|
|
186
61
|
|
|
187
62
|
本项目是送给 **zhangyi** 的七夕礼物。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhangfengshun/dsh-remote-ssh",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.9",
|
|
4
4
|
"description": "DSH web plugin: VSCode Remote-SSH-like remote development (SSH to supercomputers/servers, remote workspace, file explorer, integrated terminal), integrated with dsh-better-sidebar and DSH settings.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|