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
你需要相应地填充 Cmd 的 Env 字段。
更多关于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)
}
关键修改点:
-
正确使用
exec.Command:第一个参数必须是可执行文件的路径或名称,后续参数是传递给该命令的参数。 -
通过
cmd.Env设置环境变量:环境变量需要单独设置,而不是作为命令参数传递。 -
错误处理改进:添加了基本的错误处理,包括读取文件时的错误检查和命令执行失败时的 stderr 输出。
-
参数处理优化:更清晰地分离命令和参数。
如果 /usr/lib64/centos.so 文件确实存在且路径正确,这个修改应该能解决 fork/exec 错误。

