79 lines
2.2 KiB
Go
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
|
|
}
|