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 }