@xiaoqiong0v0/opencode-ssh-tool 0.2.6 → 0.2.7
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 +7 -0
- package/dist/server.js +67 -7
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -84,6 +84,13 @@ opencode 插件:让 opencode 像人一样操作**长驻交互式 SSH 会话**
|
|
|
84
84
|
2. **SSH agent**:agent socket / Windows OpenSSH agent
|
|
85
85
|
3. **环境变量密码**:`SSH_PASS_<HOST大写>` 优先,回退 `SSH_PASSWORD`
|
|
86
86
|
|
|
87
|
+
> [!WARNING] 风险警告
|
|
88
|
+
> `ssh_connect` 的 `password` 参数(明文或 `file:` 路径)允许模型直接凭密码建立连接,**绕过密钥认证,一旦建立便无法像正常会话那样可靠授权与撤销**——远程主机上的命令操作难以被 opencode 权限系统有效管控。
|
|
89
|
+
>
|
|
90
|
+
> **最佳用途**:仅用于一次性**辅助安装 opencode 到远程目标**(bootstrap),或完全可信的临时环境。
|
|
91
|
+
>
|
|
92
|
+
> **请谨慎使用**:生产 / 重要主机请使用 SSH key + 正常审批流程,不要暴露密码直连。
|
|
93
|
+
|
|
87
94
|
## 权限管控
|
|
88
95
|
|
|
89
96
|
```text
|
package/dist/server.js
CHANGED
|
@@ -141,22 +141,42 @@ function renderPage() {
|
|
|
141
141
|
select { background: #21262d; color: #c9d1d9; border: 1px solid #30363d; padding: 4px 8px; border-radius: 6px; }
|
|
142
142
|
pre { margin: 0; padding: 16px; font-family: "Cascadia Code", Consolas, "Courier New", monospace; font-size: 13px; line-height: 1.5; white-space: pre; overflow: auto; height: calc(100% - 52px); box-sizing: border-box; color: #c9d1d9; }
|
|
143
143
|
#meta { font-size: 12px; color: #8b949e; }
|
|
144
|
+
/* 深色细滚动条:匹配暗色主题 */
|
|
145
|
+
::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
146
|
+
::-webkit-scrollbar-track { background: #161b22; }
|
|
147
|
+
::-webkit-scrollbar-thumb { background: #30363d; border-radius: 5px; border: 2px solid #161b22; }
|
|
148
|
+
::-webkit-scrollbar-thumb:hover { background: #484f58; }
|
|
149
|
+
::-webkit-scrollbar-corner { background: #161b22; }
|
|
150
|
+
* { scrollbar-width: thin; scrollbar-color: #30363d #161b22; }
|
|
151
|
+
/* 回到底部悬浮按钮:离开底部且有新消息时显示 */
|
|
152
|
+
.to-bottom-btn {
|
|
153
|
+
position: fixed; right: 24px; bottom: 24px; display: none;
|
|
154
|
+
background: #238636; color: #fff; border: none; border-radius: 20px;
|
|
155
|
+
padding: 8px 16px; font-size: 13px; cursor: pointer; z-index: 10;
|
|
156
|
+
box-shadow: 0 4px 12px rgba(0,0,0,.4);
|
|
157
|
+
}
|
|
158
|
+
.to-bottom-btn:hover { background: #2ea043; }
|
|
144
159
|
</style>
|
|
145
160
|
</head>
|
|
146
161
|
<body>
|
|
147
162
|
<header>
|
|
148
163
|
<h1>SSH 终端记录</h1>
|
|
149
|
-
<select id="session" onchange="onSessionChange()"></select>
|
|
150
|
-
<select id="terminal" onchange="
|
|
164
|
+
<select id="session" onchange="onSessionChange(true)"></select>
|
|
165
|
+
<select id="terminal" onchange="onSessionChange(true)"></select>
|
|
151
166
|
<span id="meta"></span>
|
|
152
167
|
</header>
|
|
153
168
|
<pre id="term">加载中...</pre>
|
|
169
|
+
<button id="toBottom" class="to-bottom-btn" onclick="scrollToNewest()">↓ 新消息</button>
|
|
154
170
|
<script>
|
|
155
171
|
let sessionsData = [];
|
|
156
172
|
// 是否贴底(用户向上滚动查看历史时不自动下滚,仅贴底时跟随新输出)
|
|
157
173
|
let stickToBottom = true;
|
|
158
174
|
// 上次会话列表指纹(无变化则不重建下拉框,避免打断用户选择/焦点)
|
|
159
175
|
let lastSessionsKey = "";
|
|
176
|
+
// 上次渲染的 transcript 文本(判断是否真有新消息才显示悬浮按钮)
|
|
177
|
+
let lastTranscript = "";
|
|
178
|
+
// 新消息顶部位置(点击悬浮按钮时滚动到此处,而非底部)
|
|
179
|
+
let pendingTop = 0;
|
|
160
180
|
|
|
161
181
|
// ANSI → 彩色 HTML:消费所有 CSI 序列(颜色/光标/清屏等),SGR 着色、其余丢弃;先 HTML 转义防 XSS
|
|
162
182
|
const ANSI_BASE = ["#010101","#de382b","#39b54a","#ffc005","#006fb8","#762671","#2cb3e9","#c9d1d9"];
|
|
@@ -230,10 +250,12 @@ function renderPage() {
|
|
|
230
250
|
}
|
|
231
251
|
if (prev && [...sel.options].some(o => o.value === prev)) sel.value = prev;
|
|
232
252
|
else sel.selectedIndex = sessionsData.length ? 0 : -1;
|
|
233
|
-
onSessionChange();
|
|
253
|
+
onSessionChange(false);
|
|
234
254
|
}
|
|
235
255
|
|
|
236
|
-
function onSessionChange() {
|
|
256
|
+
function onSessionChange(forceStick) {
|
|
257
|
+
lastTranscript = "";
|
|
258
|
+
pendingTop = 0;
|
|
237
259
|
const sel = document.getElementById("session");
|
|
238
260
|
const sid = sel.value;
|
|
239
261
|
const tsel = document.getElementById("terminal");
|
|
@@ -248,8 +270,8 @@ function renderPage() {
|
|
|
248
270
|
}
|
|
249
271
|
if (prev && [...tsel.options].some(o => o.value === prev)) tsel.value = prev;
|
|
250
272
|
else tsel.selectedIndex = tsel.options.length ? 0 : -1;
|
|
251
|
-
//
|
|
252
|
-
stickToBottom = true;
|
|
273
|
+
// 仅用户主动切换会话/终端时强制回到底部;自动轮询重建不打扰当前滚动位置
|
|
274
|
+
if (forceStick) stickToBottom = true;
|
|
253
275
|
loadTranscript();
|
|
254
276
|
}
|
|
255
277
|
|
|
@@ -264,9 +286,47 @@ function renderPage() {
|
|
|
264
286
|
if (pre.scrollTop + pre.clientHeight >= pre.scrollHeight - 30) stickToBottom = true;
|
|
265
287
|
const r = await fetch("/api/transcript?session=" + encodeURIComponent(sid) + "&name=" + encodeURIComponent(name));
|
|
266
288
|
const text = await r.text();
|
|
289
|
+
// 渲染前旧内容完整高度 = 新消息顶部位置(旧内容不变时高度稳定)
|
|
290
|
+
const prevHeight = pre.scrollHeight;
|
|
291
|
+
// 内容是否有新变化(有新消息才显示悬浮按钮)
|
|
292
|
+
const changed = text !== lastTranscript;
|
|
293
|
+
lastTranscript = text;
|
|
267
294
|
pre.innerHTML = ansiToHtml(text);
|
|
268
295
|
document.getElementById("meta").textContent = sid + "/" + name + " · " + text.length + " 字符 · 每 2s 自动刷新";
|
|
269
|
-
if (stickToBottom)
|
|
296
|
+
if (stickToBottom) {
|
|
297
|
+
pre.scrollTop = pre.scrollHeight;
|
|
298
|
+
toBottomBtn.style.display = "none";
|
|
299
|
+
} else if (pendingTop > 0) {
|
|
300
|
+
// 离开底部且有未读新消息 → 显示悬浮按钮(pendingTop 为跳转位置)
|
|
301
|
+
toBottomBtn.style.display = "block";
|
|
302
|
+
}
|
|
303
|
+
// 无论贴底与否,有内容变化都记录新消息顶部(供用户滚上去后跳转)
|
|
304
|
+
if (changed && pre.scrollHeight > pre.clientHeight) {
|
|
305
|
+
pendingTop = prevHeight;
|
|
306
|
+
if (stickToBottom) {
|
|
307
|
+
// 贴底跟随 = 已读到最新,清除未读标记(用户滚上去才重新提示)
|
|
308
|
+
pendingTop = 0;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// 用户滚动:贴底 → 恢复跟随并隐藏按钮;离开底部 → 取消自动贴底
|
|
314
|
+
const termPre = document.getElementById("term");
|
|
315
|
+
const toBottomBtn = document.getElementById("toBottom");
|
|
316
|
+
termPre.addEventListener("scroll", () => {
|
|
317
|
+
if (termPre.scrollTop + termPre.clientHeight >= termPre.scrollHeight - 30) {
|
|
318
|
+
stickToBottom = true;
|
|
319
|
+
toBottomBtn.style.display = "none";
|
|
320
|
+
pendingTop = 0; // 贴底 = 已读到最新,清除未读标记
|
|
321
|
+
} else {
|
|
322
|
+
stickToBottom = false;
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
// 点击悬浮按钮:滚动到新消息顶部(阅读未读内容),不强制回到底部
|
|
326
|
+
function scrollToNewest() {
|
|
327
|
+
termPre.scrollTop = pendingTop > 0 ? pendingTop : termPre.scrollHeight;
|
|
328
|
+
pendingTop = 0;
|
|
329
|
+
toBottomBtn.style.display = "none";
|
|
270
330
|
}
|
|
271
331
|
|
|
272
332
|
loadSessions();
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAmBpD;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,WAAiC,EAAE,GAAW;IACtF,IAAI,UAAU,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAA;QACvD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAA;QAEzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC1D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,oCAAoC;YACpC,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;YACnC,4BAA4B;YAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkL,CAAA;YAC3M,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;oBAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;gBACtH,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YAClK,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjE,SAAS;gBACT,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC,CAAA;YACH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC1D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACvD,OAAM;QACR,CAAC;QAED,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;YACjD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAA;YACtD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;YAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,mCAAmC;gBACnC,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBAChD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAA;oBACnE,GAAG,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;oBAC5C,OAAM;gBACR,CAAC;gBACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAA;gBACnE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACb,OAAM;YACR,CAAC;YACD,gCAAgC;YAChC,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACzD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;gBAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;YACzD,CAAC;YACD,uBAAuB;YACvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAA;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACd,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAA;YAClC,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAA;YACnE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YACzB,OAAM;QACR,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAA;YAClE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACrB,OAAM;QACR,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAA;QACnE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAiB,CAAA;YAC5C,UAAU,GAAG,IAAI,CAAC,IAAI,CAAA;YACtB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACtC,OAAO,CAAC;gBACN,MAAM;gBACN,IAAI,EAAE,UAAU;gBAChB,GAAG,EAAE,oBAAoB,UAAU,EAAE;gBACrC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;aAC5B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,GAAW,EAAE,SAAiB,EAAE,IAAY;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IACvC,IAAI,KAAe,CAAA;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,CAAA;IACZ,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAA0C,CAAA;YACrG,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACrE,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,iCAAiC;AACjC,SAAS,UAAU;IACjB,OAAO
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|