From 9197031e8137874e3df7b021edecee08323b4655 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Mon, 14 Aug 2023 17:36:17 +0800 Subject: [PATCH] =?UTF-8?q?[=20Agent=20]=20[=20Executor=20]=20-=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0windows=20executor=E9=83=A8=E5=88=86=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent-go/executor/BaseFunction.go | 2 +- agent-go/executor/CommandExecutor.go | 20 ++++++-- agent-go/executor/WindowsFunction.go | 49 +++++++++++++++++++ agent-go/executor/WindowsFunction_test.go | 8 +++ .../io/wdd/server/ExecutionEntityJson.json | 3 ++ 5 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 agent-go/executor/WindowsFunction.go create mode 100644 agent-go/executor/WindowsFunction_test.go diff --git a/agent-go/executor/BaseFunction.go b/agent-go/executor/BaseFunction.go index 09d440f..e0e1d1a 100644 --- a/agent-go/executor/BaseFunction.go +++ b/agent-go/executor/BaseFunction.go @@ -97,7 +97,7 @@ func (op *AgentOsOperator) Exec(baseFuncName string, funcArgs ...string) []strin // exec the command here for _, singleLineCommand := range multiLineCommand { - singleCommandResult := AllOutputCommandExecutor(singleLineCommand) + singleCommandResult, _ := AllOutputCommandExecutor(singleLineCommand) result = append(result, "") result = append(result, singleCommandResult...) diff --git a/agent-go/executor/CommandExecutor.go b/agent-go/executor/CommandExecutor.go index 71d106d..1b28c13 100644 --- a/agent-go/executor/CommandExecutor.go +++ b/agent-go/executor/CommandExecutor.go @@ -76,9 +76,18 @@ func Execute(em *ExecutionMessage) ([]string, error) { func PipeLineCommandExecutor(pipeLineCommand [][]string) ([]string, error) { + var resultSlice []string var output []byte var err error + tmp := make([]string, len(pipeLineCommand)) + for index, pipe := range pipeLineCommand { + tmp[index] = strings.Join(pipe, " ") + } + pipelineCommandString := strings.Join(tmp, " | ") + + resultSlice = append(resultSlice, fmt.Sprintf(" ========= 命令为 ====> %s", pipelineCommandString)) + for _, pipeCommand := range pipeLineCommand { if len(pipeCommand) == 0 { continue @@ -89,14 +98,19 @@ func PipeLineCommandExecutor(pipeLineCommand [][]string) ([]string, error) { command.Stdin = bytes.NewBuffer(output) } - output, err = command.Output() + output, err = command.CombinedOutput() if err != nil { log.ErrorF("Pipeline Command Exec Error => %v", err.Error()) - break + + // 收集错误的信息 + resultSlice = append(resultSlice, "↓↓↓ 命令 错误 如下 ↓↓↓", string(output)) + return resultSlice, err } } - return []string{string(output)}, err + // 正常的输出 + resultSlice = append(resultSlice, "↓↓↓ 命令 输出 如下 ↓↓↓", string(output)) + return resultSlice, err } func MultiLineCommandExecutor(multiLineCommandExecutor [][]string) ([]string, error) { diff --git a/agent-go/executor/WindowsFunction.go b/agent-go/executor/WindowsFunction.go new file mode 100644 index 0000000..a8883f6 --- /dev/null +++ b/agent-go/executor/WindowsFunction.go @@ -0,0 +1,49 @@ +package executor + +import ( + "fmt" + "os/exec" + "strings" + "syscall" + "unsafe" +) + +var ( + user32DLL = syscall.NewLazyDLL("user32.dll") + messageBox = user32DLL.NewProc("MessageBoxW") +) + +func FindPublicIpAddress() { + + cmd := exec.Command("curl", "ifconfig.io") + output, err := cmd.Output() + if err != nil { + fmt.Println("无法获取公网IP地址:", err) + return + } + + ip := strings.TrimSpace(string(output)) + fmt.Println("公网IP地址:", ip) +} + +func CallAgent() { + var ( + hWnd uintptr + text = "Hello, World!" + caption = "Golang Win32API" + flags = uint(0x00000001) // MB_OK + ) + + ret, _, err := messageBox.Call( + hWnd, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), + uintptr(flags), + ) + if ret == 0 { + fmt.Println("MessageBox failed:", err) + return + } + + fmt.Println("MessageBox returned:", ret) +} diff --git a/agent-go/executor/WindowsFunction_test.go b/agent-go/executor/WindowsFunction_test.go new file mode 100644 index 0000000..cf1ce21 --- /dev/null +++ b/agent-go/executor/WindowsFunction_test.go @@ -0,0 +1,8 @@ +package executor + +import "testing" + +func TestCallAgent(t *testing.T) { + + FindPublicIpAddress() +} diff --git a/server/src/test/java/io/wdd/server/ExecutionEntityJson.json b/server/src/test/java/io/wdd/server/ExecutionEntityJson.json index dcc1d8f..75dfbf8 100644 --- a/server/src/test/java/io/wdd/server/ExecutionEntityJson.json +++ b/server/src/test/java/io/wdd/server/ExecutionEntityJson.json @@ -24,6 +24,9 @@ [ "grep", "root" + ], + [ + "ping" ] ] } \ No newline at end of file