diff --git a/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts b/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts index a574b09d..ac54613f 100644 --- a/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts +++ b/packages/ui/certd-server/src/plugins/plugin-host/lib/ssh.ts @@ -1,5 +1,5 @@ // @ts-ignore -import ssh2, { ConnectConfig } from 'ssh2'; +import ssh2, { ConnectConfig, ExecOptions } from 'ssh2'; import path from 'path'; import * as _ from 'lodash-es'; import { ILogger } from '@certd/pipeline'; @@ -269,7 +269,7 @@ export class SshClient { * Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe" * @param options */ - async exec(options: { connectConf: SshAccess; script: string | Array }) { + async exec(options: { connectConf: SshAccess; script: string | Array; env?: any }): Promise { let { script } = options; const { connectConf } = options; @@ -278,14 +278,32 @@ export class SshClient { connectConf, callable: async (conn: AsyncSsh2Client) => { let isWinCmd = false; + const isLinux = !connectConf.windows; + const envScripts = []; if (connectConf.windows) { isWinCmd = await this.isCmd(conn); } + + if (options.env) { + for (const key in options.env) { + if (isLinux) { + envScripts.push(`export ${key}=${options.env[key]}`); + } else if (isWinCmd) { + //win cmd + envScripts.push(`set ${key}=${options.env[key]}`); + } else { + //powershell + envScripts.push(`$env:${key}="${options.env[key]}"`); + } + } + } + if (isWinCmd) { //组合成&&的形式 if (typeof script === 'string') { script = script.split('\n'); } + script = envScripts.concat(script); script = script as Array; script = script.join(' && '); } else { @@ -293,6 +311,9 @@ export class SshClient { script = script as Array; script = script.join('\n'); } + if (envScripts.length > 0) { + script = envScripts.join('\n') + '\n' + script; + } } await conn.exec(script); }, diff --git a/packages/ui/certd-server/src/plugins/plugin-host/plugin/upload-to-host/index.ts b/packages/ui/certd-server/src/plugins/plugin-host/plugin/upload-to-host/index.ts index 140f5c71..62dc9fa4 100644 --- a/packages/ui/certd-server/src/plugins/plugin-host/plugin/upload-to-host/index.ts +++ b/packages/ui/certd-server/src/plugins/plugin-host/plugin/upload-to-host/index.ts @@ -3,6 +3,7 @@ import { SshClient } from '../../lib/ssh.js'; import { CertInfo, CertReader, CertReaderHandleContext } from '@certd/plugin-cert'; import * as fs from 'fs'; import { SshAccess } from '../../access/index.js'; +import dayjs from 'dayjs'; @IsTaskPlugin({ name: 'uploadCertToHost', @@ -106,6 +107,18 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin { }) script!: string; + @TaskInput({ + title: '注入环境变量', + value: false, + component: { + name: 'a-switch', + vModel: 'checked', + }, + helper: '是否将证书域名、路径等信息注入脚本执行环境变量中,具体的变量名称,可以运行后从日志中查看', + required: false, + }) + injectEnv!: string; + @TaskOutput({ title: '证书保存路径', }) @@ -233,10 +246,28 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin { const connectConf: SshAccess = await this.accessService.getById(accessId); const sshClient = new SshClient(this.logger); this.logger.info('执行脚本命令'); + + //环境变量 + const env = {}; + if (this.injectEnv) { + const domains = certReader.getAllDomains(); + for (let i = 0; i < domains.length; i++) { + env[`CERT_DOMAIN_${i}`] = domains[i]; + } + env['CERT_EXPIRES'] = dayjs(certReader.getCrtDetail().expires).unix(); + + env['HOST_CRT_PATH'] = this.hostCrtPath || ''; + env['HOST_KEY_PATH'] = this.hostKeyPath || ''; + env['HOST_IC_PATH'] = this.hostIcPath || ''; + env['HOST_PFX_PATH'] = this.hostPfxPath || ''; + env['HOST_DER_PATH'] = this.hostDerPath || ''; + } + const scripts = this.script.split('\n'); await sshClient.exec({ connectConf, script: scripts, + env, }); } }