fix: 修复ssh支持键盘事件登录

pull/361/head
xiaojunnuo 2025-04-02 00:20:09 +08:00
parent 86d5626d92
commit 8145808c43
5 changed files with 75 additions and 6 deletions

View File

@ -124,6 +124,14 @@ export default defineConfig({
] ]
} }
], ],
"/deploy/":[
{
text: "部署任务",
items: [
{ text: "部署到ESXi", link: "/deploy/ESXi/index.md" },
]
}
],
"/comm/": [ "/comm/": [
{ {
text: "商业版", text: "商业版",

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

17
docs/deploy/ESXi/index.md Normal file
View File

@ -0,0 +1,17 @@
# 部署证书到ESXi
使用`部署证书到主机插件`即可
## 开启ssh
登陆ESXi Web后台点击 主机 -> 操作 -> 服务 -> 启用 Secure ShellSSH打开SSH
## 添加部署到主机任务
![img.png](./images/ssh.png)
## 配置重启脚本
```bash
/etc/init.d/hostd restart
/etc/init.d/vpxa restart
```

View File

@ -1,5 +1,6 @@
import { AccessInput, BaseAccess, IsAccess } from "@certd/pipeline"; import { AccessInput, BaseAccess, IsAccess } from "@certd/pipeline";
import { ConnectConfig } from "ssh2"; import { ConnectConfig } from "ssh2";
import { SshClient } from "./ssh.js";
@IsAccess({ @IsAccess({
name: "ssh", name: "ssh",
@ -101,6 +102,37 @@ export class SshAccess extends BaseAccess implements ConnectConfig {
}, },
}) })
encoding: string; 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(); new SshAccess();

View File

@ -1,5 +1,7 @@
// @ts-ignore // @ts-ignore
import ssh2, { ConnectConfig, ExecOptions } from "ssh2"; import ssh2, { ConnectConfig, ExecOptions } from "ssh2";
import ssh2Constants from "ssh2/lib/protocol/constants.js";
import path from "path"; import path from "path";
import * as _ from "lodash-es"; import * as _ from "lodash-es";
import { ILogger } from "@certd/basic"; import { ILogger } from "@certd/basic";
@ -50,6 +52,8 @@ export class AsyncSsh2Client {
this.logger.info("代理连接成功"); this.logger.info("代理连接成功");
this.connConf.sock = info.socket; this.connConf.sock = info.socket;
} }
const { SUPPORTED_KEX, SUPPORTED_SERVER_HOST_KEY, SUPPORTED_CIPHER, SUPPORTED_MAC } = ssh2Constants;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
const conn = new ssh2.Client(); const conn = new ssh2.Client();
@ -63,15 +67,23 @@ export class AsyncSsh2Client {
this.conn = conn; this.conn = conn;
resolve(this.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({ .connect({
...this.connConf, ...this.connConf,
tryKeyboard: true,
algorithms: { algorithms: {
kex: [ serverHostKey: SUPPORTED_SERVER_HOST_KEY,
"ecdh-sha2-nistp256", cipher: SUPPORTED_CIPHER,
"diffie-hellman-group1-sha1", hmac: SUPPORTED_MAC,
"diffie-hellman-group14-sha1", // 示例:添加服务器支持的旧算法 kex: SUPPORTED_KEX,
"diffie-hellman-group-exchange-sha256",
],
}, },
}); });
} catch (e) { } catch (e) {