Golang中解决Fork/exec报错:LD_PRELOAD导致的文件或目录不存在问题

Golang中解决Fork/exec报错:LD_PRELOAD导致的文件或目录不存在问题 你好,我正在通过 exec.Command() 加载一个共享库,但在运行时遇到了错误。 以下是我的代码:

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
)

func main() {
	xargs := os.Args[1:]
	var cmd string
	for i := 0; i < len(xargs); i++ {
		cmd = cmd + xargs[i]
		cmd = cmd + " "
	}
	fmt.Printf("Args : %s\n", cmd)
	str := "LD_PRELOAD=/usr/lib64/centos.so" + " ACCUR=\"" + file_get_content("/usr/cctos/.okkur") + "\" " + cmd
	fmt.Printf("Full Cmd : %s\n", str)
	okkur := "ACCUR=\"" + file_get_content("/usr/cctos/.okkur") + "\""
	out, err := exec.Command("LD_PRELOAD=/usr/lib64/centos.so", okkur, cmd).Output()
	fmt.Printf("\nOutput : %s\n", out)
	fmt.Printf("\nError : %s\n", err)

}

func file_get_content(filename string) string {
	fileData, _ := ioutil.ReadFile(filename)
	fileString := string(fileData)
	return fileString
}

错误信息如下:

fork/exec LD_PRELOAD=/usr/lib64/centos.so: no such file or directory

我在我的桌面电脑上编译了这个文件,然后上传到服务器。在服务器上,/usr/lib64/centos.so 文件是存在的,但错误依然出现。 我用 C 语言尝试了同样的事情,它是可以工作的。在终端里也能正常工作。


更多关于Golang中解决Fork/exec报错:LD_PRELOAD导致的文件或目录不存在问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你需要相应地填充 CmdEnv 字段。

https://golang.org/pkg/os/exec/#Cmd

更多关于Golang中解决Fork/exec报错:LD_PRELOAD导致的文件或目录不存在问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题在于 exec.Command 的第一个参数被错误地指定为环境变量设置。exec.Command 的第一个参数应该是要执行的命令或程序路径,而不是环境变量。

在 Go 中,环境变量需要通过 cmd.Env 字段单独设置。以下是修正后的代码:

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: program <command>")
		return
	}

	// 获取要执行的命令和参数
	cmdArgs := os.Args[1:]
	
	// 读取配置文件内容
	accurContent := file_get_content("/usr/cctos/.okkur")
	
	// 创建命令
	cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...)
	
	// 设置环境变量
	cmd.Env = append(os.Environ(),
		"LD_PRELOAD=/usr/lib64/centos.so",
		fmt.Sprintf("ACCUR=%s", accurContent),
	)
	
	// 执行命令并获取输出
	out, err := cmd.Output()
	if err != nil {
		fmt.Printf("Error executing command: %v\n", err)
		if exitErr, ok := err.(*exec.ExitError); ok {
			fmt.Printf("Stderr: %s\n", exitErr.Stderr)
		}
		return
	}
	
	fmt.Printf("Output: %s\n", out)
}

func file_get_content(filename string) string {
	fileData, err := ioutil.ReadFile(filename)
	if err != nil {
		return ""
	}
	return string(fileData)
}

关键修改点:

  1. 正确使用 exec.Command:第一个参数必须是可执行文件的路径或名称,后续参数是传递给该命令的参数。

  2. 通过 cmd.Env 设置环境变量:环境变量需要单独设置,而不是作为命令参数传递。

  3. 错误处理改进:添加了基本的错误处理,包括读取文件时的错误检查和命令执行失败时的 stderr 输出。

  4. 参数处理优化:更清晰地分离命令和参数。

如果 /usr/lib64/centos.so 文件确实存在且路径正确,这个修改应该能解决 fork/exec 错误。

回到顶部