From 8145808c4370364377b4ffe3ae88ff465b49f20b Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Wed, 2 Apr 2025 00:20:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dssh=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=94=AE=E7=9B=98=E4=BA=8B=E4=BB=B6=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/config.ts | 8 +++++ docs/deploy/ESXi/images/ssh.png | Bin 0 -> 48020 bytes docs/deploy/ESXi/index.md | 17 ++++++++++ .../plugins/plugin-lib/src/ssh/ssh-access.ts | 32 ++++++++++++++++++ packages/plugins/plugin-lib/src/ssh/ssh.ts | 24 +++++++++---- 5 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 docs/deploy/ESXi/images/ssh.png create mode 100644 docs/deploy/ESXi/index.md diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 800fe8a1..919f4959 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -124,6 +124,14 @@ export default defineConfig({ ] } ], + "/deploy/":[ + { + text: "部署任务", + items: [ + { text: "部署到ESXi", link: "/deploy/ESXi/index.md" }, + ] + } + ], "/comm/": [ { text: "商业版", diff --git a/docs/deploy/ESXi/images/ssh.png b/docs/deploy/ESXi/images/ssh.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdfea3d544679a2a17ea2f488eed3810568be33 GIT binary patch literal 48020 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 操作 -> 服务 -> 启用 Secure Shell(SSH)打开SSH + +## 添加部署到主机任务 + +![img.png](./images/ssh.png) + +## 配置重启脚本 +```bash +/etc/init.d/hostd restart +/etc/init.d/vpxa restart +``` diff --git a/packages/plugins/plugin-lib/src/ssh/ssh-access.ts b/packages/plugins/plugin-lib/src/ssh/ssh-access.ts index 228bd1e0..0c759de1 100644 --- a/packages/plugins/plugin-lib/src/ssh/ssh-access.ts +++ b/packages/plugins/plugin-lib/src/ssh/ssh-access.ts @@ -1,5 +1,6 @@ import { AccessInput, BaseAccess, IsAccess } from "@certd/pipeline"; import { ConnectConfig } from "ssh2"; +import { SshClient } from "./ssh.js"; @IsAccess({ name: "ssh", @@ -101,6 +102,37 @@ export class SshAccess extends BaseAccess implements ConnectConfig { }, }) encoding: string; + + @AccessInput({ + title: "测试", + component: { + name: "api-test", + type: "access", + typeName: "ssh", + action: "TestRequest", + }, + mergeScript: ` + return { + component:{ + form: ctx.compute(({form})=>{ + return form + }) + }, + } + `, + helper: "点击测试", + }) + testRequest = true; + + async onTestRequest() { + const client = new SshClient(this.ctx.logger); + + await client.exec({ + connectConf: this, + script: "echo hello", + }); + return "ok"; + } } new SshAccess(); diff --git a/packages/plugins/plugin-lib/src/ssh/ssh.ts b/packages/plugins/plugin-lib/src/ssh/ssh.ts index 40930de0..34e678c9 100644 --- a/packages/plugins/plugin-lib/src/ssh/ssh.ts +++ b/packages/plugins/plugin-lib/src/ssh/ssh.ts @@ -1,5 +1,7 @@ // @ts-ignore import ssh2, { ConnectConfig, ExecOptions } from "ssh2"; + +import ssh2Constants from "ssh2/lib/protocol/constants.js"; import path from "path"; import * as _ from "lodash-es"; import { ILogger } from "@certd/basic"; @@ -50,6 +52,8 @@ export class AsyncSsh2Client { this.logger.info("代理连接成功"); this.connConf.sock = info.socket; } + + const { SUPPORTED_KEX, SUPPORTED_SERVER_HOST_KEY, SUPPORTED_CIPHER, SUPPORTED_MAC } = ssh2Constants; return new Promise((resolve, reject) => { try { const conn = new ssh2.Client(); @@ -63,15 +67,23 @@ export class AsyncSsh2Client { this.conn = conn; resolve(this.conn); }) + .on("keyboard-interactive", (name, descr, lang, prompts, finish) => { + // For illustration purposes only! It's not safe to do this! + // You can read it from process.stdin or whatever else... + const password = this.connConf.password; + return finish([password]); + + // And remember, server may trigger this event multiple times + // and for different purposes (not only auth) + }) .connect({ ...this.connConf, + tryKeyboard: true, algorithms: { - kex: [ - "ecdh-sha2-nistp256", - "diffie-hellman-group1-sha1", - "diffie-hellman-group14-sha1", // 示例:添加服务器支持的旧算法 - "diffie-hellman-group-exchange-sha256", - ], + serverHostKey: SUPPORTED_SERVER_HOST_KEY, + cipher: SUPPORTED_CIPHER, + hmac: SUPPORTED_MAC, + kex: SUPPORTED_KEX, }, }); } catch (e) {