如何通过Golang获取第三方进程的启动参数
在Golang中获取进程的启动参数
获取进程的启动参数需要分平台处理,以下是针对不同系统的实现方案:
类Unix系统(Linux/macOS)
类Unix系统可以直接读取/proc/<PID>/cmdline文件,该文件以**空字符(\x00)**分隔进程的所有启动参数,读取后拆分即可得到完整参数列表:
package main import ( "fmt" "io/ioutil" "strings" ) // getCmdline 根据PID获取进程的启动参数列表 func getCmdline(pid int) ([]string, error) { data, err := ioutil.ReadFile(fmt.Sprintf("/proc/%d/cmdline", pid)) if err != nil { return nil, err } // 按空字符拆分,去掉最后一个空串(文件末尾的空字符) parts := strings.Split(string(data), "\x00") return parts[:len(parts)-1], nil } func main() { targetPID := 1234 // 替换为你要查询的进程PID args, err := getCmdline(targetPID) if err != nil { fmt.Printf("获取参数失败:%v\n", err) return } fmt.Println("进程启动参数:") for idx, arg := range args { fmt.Printf("%d: %s\n", idx, arg) } }
Windows平台
Windows下需要调用系统API获取进程的命令行参数,以下是基于syscall的实现,直接调用Windows原生API保证准确性:
package main import ( "fmt" "syscall" "unsafe" ) var ( kernel32 = syscall.NewLazyDLL("kernel32.dll") openProcess = kernel32.NewProc("OpenProcess") closeHandle = kernel32.NewProc("CloseHandle") psapi = syscall.NewLazyDLL("psapi.dll") getCommandLineProcessW = psapi.NewProc("GetCommandLineProcessW") ) const ( PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_VM_READ = 0x0010 ) // getCmdline 根据PID获取进程的完整启动命令行 func getCmdline(pid int) (string, error) { // 打开进程获取句柄 handle, _, err := openProcess.Call( uintptr(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ), uintptr(0), uintptr(pid), ) if handle == 0 { return "", err } defer closeHandle.Call(handle) // 确保释放句柄 // 获取命令行指针 cmdLinePtr, _, err := getCommandLineProcessW.Call(handle) if cmdLinePtr == 0 { return "", err } // 转换为字符串 cmdLine, err := syscall.UTF16PtrToString((*uint16)(unsafe.Pointer(cmdLinePtr))) if err != nil { return "", err } return cmdLine, nil } func main() { targetPID := 1234 // 替换为你要查询的进程PID cmdline, err := getCmdline(targetPID) if err != nil { fmt.Printf("获取命令行失败:%v\n", err) return } fmt.Println("进程启动命令行:") fmt.Println(cmdline) // 若需要拆分参数,可以使用strings.Fields或专门的命令行解析库(如github.com/spf13/pflag) }
注意事项
- 权限问题:获取其他进程的参数需要足够权限,Windows下可能需要管理员权限,Linux/macOS下需要对应进程的访问权限或root权限。
- 第三方库可选:可以使用
github.com/mitchellh/go-ps等库简化操作,但部分库在Windows下可能无法获取完整命令行,直接调用系统API更可靠。
内容的提问来源于stack exchange,提问作者Silk Opener
相关产品推荐
相关产品推荐

