func Exec(command string) error { in := bytes.NewBuffer(nil) cmd := exec.Command("sh") cmd.Stdin = in in.WriteString(command) in.WriteString("exit\n") if err := cmd.Run(); err != nil { return err } return nil } func (h *Headscale) GetRoutesIp(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") var req GetRoutesIpReq jsonerr := json.NewDecoder(r.Body).Decode(&req) if jsonerr != nil { http.Error(w, "Failed to decode JSON", http.StatusBadRequest) return } response := GetRoutesIpResp{} cmd := exec.Command("/root/digital_guard/headscale", "routes", "list") routesCmdString := cmd.String() output, cmderr := cmd.CombinedOutput() if cmderr != nil { log.Info().Msgf("Failed to execute shell command: %s", cmderr.Error()) response.Messge = append(response.Messge, routesCmdString) } data := string(output) lines := strings.Split(data, "\n") for _, ipToFinds := range req.Ip { for _, line := range lines { if strings.Contains(line, ipToFinds) && strings.Contains(line, req.Name) { fields := strings.Fields(line) if len(fields) >= 3 { id := fields[0] // s := []string{"/root/digital_guard/headscale routes enable --route ", "1", " set-Advertised=true set-Enabled=true"} // s[1] = id // strCmdbyte := strings.Join(s, "") // errs := Exec(strCmdbyte) errs := Exec("/root/digital_guard/headscale routes enable --route " + id + " set-Advertised=true set-Enabled=true") if errs != nil { // log.Info().Msg(fmt.Sprintf("-----------err------shell命令----------: %s", strCmdbyte)) // response.Messge = append(response.Messge, strCmdbyte) } else { response.Code = 1 } } } } } respJSON, err := json.Marshal(response) if err != nil { http.Error(w, "Failed to encode JSON", http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) w.Write(respJSON) } 这样执行的linux命令失败
时间: 2024-03-17 16:46:58 浏览: 57
根据您提供的代码,我看到您尝试执行的 Linux 命令是 `/root/digital_guard/headscale routes enable --route <id> set-Advertised=true set-Enabled=true`,您说该命令执行失败,但是没有提供具体的错误信息。如果您能够提供该命令执行失败的具体错误信息,我可以更好地帮助您解决问题。
除此之外,您的代码中使用了 `exec.Command` 来执行命令,但是并没有设置 `cmd.Dir` 来指定命令执行的工作目录。如果命令需要在特定的工作目录下执行,您可以设置 `cmd.Dir` 来指定。例如:
```
cmd := exec.Command("ls")
cmd.Dir = "/home/user"
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(output))
```
另外,执行 Shell 命令时最好使用 `bash` 而不是 `sh`,因为 `sh` 的行为可能会与您预期的不同。如果您的系统上没有 `bash`,可以尝试安装一下。
相关问题
cmd := exec.Command(executable) err := cmd.Run(),优化代码以root身份执行
在Go语言中,`cmd := exec.Command(executable)` 是用于创建一个新的命令执行器,而 `cmd.Run()` 则会运行这个命令。如果你需要以root权限执行命令,你需要额外处理一下权限问题。这里有一种常见的做法:
```go
package main
import (
"fmt"
"os/exec"
"os/user"
)
func main() {
// 获取当前用户的uid
currentUser, err := user.Current()
if err != nil {
fmt.Println("获取当前用户失败:", err)
return
}
// 创建新的命令执行器,并添加sudo前缀以提升权限
cmd := exec.Command("sudo", "-u", currentUser.Username, "your-executable")
// 使用stdbuf减少输出噪音
cmd.Stdin = os.Stdin // 连接标准输入
cmd.Stdout = os.Stdout // 连接标准输出
cmd.Stderr = os.Stderr // 连接错误输出
err = cmd.Run()
if err != nil {
fmt.Println("执行命令失败:", err)
}
}
```
这里我们首先获取当前用户,然后通过 `sudo -u [用户名] your-executable` 来执行命令,这样就可以以该用户的身份以root权限运行了。不过请注意,这种方法依赖于系统的sudo配置以及目标程序是否允许被其他用户以root权限运行。
exec.Command
`exec.Command` 是 os/exec 包中的一个函数,用于创建一个 `*exec.Cmd` 对象,以便执行命令行。
`exec.Command` 函数的函数签名如下:
```go
func Command(name string, arg ...string) *Cmd
```
其中,`name` 参数表示要执行的命令的名称,`arg` 参数表示要传递给命令的参数列表。
`exec.Command` 函数返回一个 `*exec.Cmd` 对象,该对象包含了执行命令的相关信息,例如要执行的命令名称、参数列表、环境变量、工作目录等等。
`*exec.Cmd` 对象提供了一些方法,用于配置执行命令的相关属性,例如:
- `cmd.Args`:命令行参数列表。
- `cmd.Env`:环境变量列表。
- `cmd.Dir`:工作目录。
- `cmd.Stdout`:标准输出。
- `cmd.Stderr`:标准错误。
- `cmd.Stdin`:标准输入。
- `cmd.Run()`:执行命令并等待命令完成。
- `cmd.Start()`:启动命令,但不等待命令完成。
- `cmd.Wait()`:等待命令完成。
以上仅是一些常用的方法,os/exec 包还提供了更多的方法和选项,具体可以参考官方文档:https://golang.org/pkg/os/exec/
阅读全文