go20/devops/agent/script/debug_script.go
2026-03-08 18:05:17 +08:00

79 lines
2.2 KiB
Go

package script
import (
"fmt"
"os"
"path/filepath"
"strings"
"time"
)
// WriteDebugScript 生成debug.sh调试脚本到工作目录
// 通过环境变量 DEBUG_SCRIPT 控制是否生成 (值为 true 或 1 时生成)
// 返回生成的文件路径,如果未生成则返回空字符串
func (s *ExecuteScriptRequest) WriteDebugScript(scriptPath string, args []string) (string, error) {
if !s.isDebugScriptEnabled() {
return "", nil
}
var sb strings.Builder
sb.WriteString("#!/bin/bash\n")
sb.WriteString("# ========== 调试脚本 (自动生成) ==========\n")
sb.WriteString("# 警告: 此脚本可能包含敏感信息,请勿提交到版本控制系统\n")
fmt.Fprintf(&sb, "# 生成时间: %s\n", time.Now().Format("2006-01-02 15:04:05"))
fmt.Fprintf(&sb, "# 工作目录: %s\n", s.workDir)
fmt.Fprintf(&sb, "# 脚本路径: %s\n", scriptPath)
if len(args) > 0 {
fmt.Fprintf(&sb, "# 脚本参数: %v\n", args)
}
sb.WriteString("# ==========================================\n\n")
sb.WriteString("set -e\n\n")
// 设置环境变量
if len(s.envVars) > 0 {
sb.WriteString("# 设置环境变量\n")
// 按key排序以保证输出一致性
keys := make([]string, 0, len(s.envVars))
for k := range s.envVars {
keys = append(keys, k)
}
// 简单排序
for i := 0; i < len(keys); i++ {
for j := i + 1; j < len(keys); j++ {
if keys[i] > keys[j] {
keys[i], keys[j] = keys[j], keys[i]
}
}
}
for _, key := range keys {
value := s.envVars[key]
// 转义值中的特殊字符
escapedValue := strings.ReplaceAll(value, "'", "'\"'\"'")
fmt.Fprintf(&sb, "export %s='%s'\n", key, escapedValue)
}
sb.WriteString("\n")
}
// 执行脚本命令
sb.WriteString("# 执行脚本\n")
sb.WriteString("exec ")
sb.WriteString(scriptPath)
for _, arg := range args {
sb.WriteString(" ")
// 转义参数中的特殊字符
escapedArg := strings.ReplaceAll(arg, "'", "'\"'\"'")
fmt.Fprintf(&sb, " '%s'", escapedArg)
}
sb.WriteString("\n")
// 写入文件
debugScriptPath := filepath.Join(s.workDir, "debug.sh")
if err := os.WriteFile(debugScriptPath, []byte(sb.String()), 0755); err != nil {
return "", fmt.Errorf("failed to write debug script: %v", err)
}
return debugScriptPath, nil
}