mirror of
https://github.com/certd/certd.git
synced 2025-11-25 09:10:11 +08:00
174 lines
3.9 KiB
TypeScript
174 lines
3.9 KiB
TypeScript
import { AccessInput, BaseAccess, IsAccess } from "@certd/pipeline";
|
||
@IsAccess({
|
||
name: "ssh",
|
||
title: "主机登录授权",
|
||
desc: "",
|
||
icon: "clarity:host-line",
|
||
input: {},
|
||
order: 0,
|
||
})
|
||
export class SshAccess extends BaseAccess {
|
||
@AccessInput({
|
||
title: "主机地址",
|
||
component: {
|
||
placeholder: "主机域名或IP地址",
|
||
},
|
||
required: true,
|
||
})
|
||
host!: string;
|
||
@AccessInput({
|
||
title: "端口",
|
||
value: 22,
|
||
component: {
|
||
name: "a-input-number",
|
||
placeholder: "22",
|
||
},
|
||
rules: [{ required: true, message: "此项必填" }],
|
||
})
|
||
port!: number;
|
||
@AccessInput({
|
||
title: "用户名",
|
||
value: "root",
|
||
rules: [{ required: true, message: "此项必填" }],
|
||
})
|
||
username!: string;
|
||
@AccessInput({
|
||
title: "密码",
|
||
component: {
|
||
name: "a-input-password",
|
||
vModel: "value",
|
||
},
|
||
encrypt: true,
|
||
helper: "登录密码或密钥必填一项",
|
||
})
|
||
password!: string;
|
||
@AccessInput({
|
||
title: "私钥登录",
|
||
helper: "私钥或密码必填一项",
|
||
component: {
|
||
name: "pem-input",
|
||
vModel: "modelValue",
|
||
},
|
||
encrypt: true,
|
||
})
|
||
privateKey!: string;
|
||
|
||
@AccessInput({
|
||
title: "私钥密码",
|
||
helper: "如果你的私钥有密码的话",
|
||
component: {
|
||
name: "a-input-password",
|
||
vModel: "value",
|
||
},
|
||
encrypt: true,
|
||
})
|
||
passphrase!: string;
|
||
|
||
@AccessInput({
|
||
title: "脚本类型",
|
||
helper: "bash 、sh 、fish",
|
||
component: {
|
||
name: "a-select",
|
||
vModel: "value",
|
||
options: [
|
||
{ value: "default", label: "默认" },
|
||
{ value: "sh", label: "sh" },
|
||
{ value: "bash", label: "bash" },
|
||
{ value: "fish", label: "fish(不支持set -e)" },
|
||
],
|
||
},
|
||
})
|
||
scriptType: string;
|
||
|
||
@AccessInput({
|
||
title: "伪终端",
|
||
helper: "如果登录报错:all authentication methods failed,可以尝试开启伪终端模式进行keyboard-interactive方式登录\n开启后对日志输出有一定的影响",
|
||
component: {
|
||
name: "a-switch",
|
||
vModel: "checked",
|
||
},
|
||
})
|
||
pty!: boolean;
|
||
|
||
@AccessInput({
|
||
title: "socks代理",
|
||
helper: "socks代理配置,格式:socks5://user:password@host:port",
|
||
component: {
|
||
name: "a-input",
|
||
vModel: "value",
|
||
placeholder: "socks5://user:password@host:port",
|
||
},
|
||
encrypt: false,
|
||
})
|
||
socksProxy!: string;
|
||
|
||
@AccessInput({
|
||
title: "超时时间",
|
||
helper: "执行命令的超时时间,单位秒,默认30分钟",
|
||
component: {
|
||
name: "a-input-number",
|
||
},
|
||
})
|
||
timeout: number;
|
||
|
||
@AccessInput({
|
||
title: "是否Windows",
|
||
helper: "如果是Windows主机,请勾选此项\n并且需要windows[安装OpenSSH](https://certd.docmirror.cn/guide/use/host/windows.html)",
|
||
component: {
|
||
name: "a-switch",
|
||
vModel: "checked",
|
||
},
|
||
})
|
||
windows = false;
|
||
|
||
@AccessInput({
|
||
title: "命令编码",
|
||
helper: "如果是Windows主机,且出现乱码了,请尝试设置为GBK",
|
||
component: {
|
||
name: "a-select",
|
||
vModel: "value",
|
||
options: [
|
||
{ value: "", label: "默认" },
|
||
{ value: "GBK", label: "GBK" },
|
||
{ value: "UTF8", label: "UTF-8" },
|
||
],
|
||
},
|
||
})
|
||
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 { SshClient } = await import("./ssh.js");
|
||
const client = new SshClient(this.ctx.logger);
|
||
|
||
const script = ["echo hello", "exit"];
|
||
await client.exec({
|
||
connectConf: this,
|
||
script: script,
|
||
});
|
||
return "ok";
|
||
}
|
||
}
|
||
|
||
new SshAccess();
|