gpt4 book ai didi

go - Go中的Os Exec Sudo命令

转载 作者:IT王子 更新时间:2023-10-29 01:07:13 25 4
gpt4 key购买 nike

在熟悉 Go 和 goroutines 的过程中,我遇到了执行命令的障碍。这些命令的格式是:

sudo find /folder -type f | while read i; do sudo -S chmod 644 "$i"; done

代码取自 How to execute system command in Golang with unknown arguments我正在尝试执行此命令,但我认为由于第一个参数是 sudo,它没有执行,我可能是错的。我只有两个问题。

当这些命令运行失败时,我返回“退出状态 1”,有没有办法得到比我正在做的更详细的错误?问题二,为什么我会使用此脚本获得“退出状态 1”?发生了什么不应该发生的事情?

package main

import (
"bufio"
"fmt"
"os"
"os/exec"
"strings"
"sync"
)

func ExeCmd(cmd string, wg *sync.WaitGroup) {
parts := strings.Fields(cmd)
head := parts[0]
// Head at this point is "sudo"
parts = parts[1:len(parts)]
out, err := exec.Command(head,parts...).Output()
if err != nil {
fmt.Printf("%s\n", err)
}
fmt.Printf("%s\n", out)
wg.Done() // Signal to WaitGroup goroutine finished
}

func InArray(a []string, e string) bool {
for _, x := range a {
if x == e {
return true
fmt.Print("True")
}
}
return false
}

func main() {
exec.Command("sudo ls > /dev/null") // Get sudo password just once, doesn't seem to work with Go
wg := new(sync.WaitGroup)
reader := bufio.NewReader(os.Stdin)
fdbslices := []string{"f", "d", "b", "files", "directories", "both"}
commands := []string{}
fdb := ""
filep := ""
dirp := ""

// Grab Path
fmt.Print("Path: ")
findpath, _ := reader.ReadString('\n')
findpath = strings.ToLower(strings.Trim(findpath, "\n"))

// Grab Files, Directories, or Both
for {
fmt.Print("Files, Directories, or Both: ")
fdb, _ = reader.ReadString('\n')
fdb = strings.ToLower(strings.Trim(fdb, "\n"))
if InArray(fdbslices, fdb) == true { break }
}

// Build commands string, these come out as they should
for {
if fdb == "f" || fdb == "files" {
fmt.Print("Permissions for Files: ")
filep, _ = reader.ReadString('\n')
filep = strings.Trim(filep, "\n")
commands = append(commands, "sudo find " + findpath + " -type f | while read i; do sudo -S chmod " + filep + " \"$i\"; done")
}
if fdb == "d" || fdb == "directories" {
fmt.Print("Permissions for Directories: ")
dirp, _ = reader.ReadString('\n')
dirp = strings.Trim(dirp, "\n")
commands = append(commands, "sudo find " + findpath + " -type d | while read i; do sudo -S chmod " + dirp + " \"$i\"; done")
}
if fdb == "b" || fdb == "both" {
fmt.Print("Permissions for Files: ")
filep, _ = reader.ReadString('\n')
filep = strings.Trim(filep, "\n")
commands = append(commands, "sudo find " + findpath + " -type f | while read i; do sudo -S chmod " + filep + " \"$i\"; done")
fmt.Print("Permissions for Directories: ")
dirp, _ = reader.ReadString('\n')
dirp = strings.Trim(dirp, "\n")
commands = append(commands, "sudo find " + findpath + " -type d | while read i; do sudo -S chmod " + dirp + " \"$i\"; done")
}
break
}

// Execute Commands
for _, str := range commands {
wg.Add(1)
fmt.Print("Doing: " + str + "\r\n")
go ExeCmd(str, wg)
}

wg.Wait()
}

示例终端输出:

Path: test
Files, Directories, or Both: b
Permissions for Files: 644
Permissions for Directories: 755
Doing: find test -type f | while read i; do sudo -S chmod 644 "$i"; done
Doing: find test -type d | while read i; do sudo -S chmod 755 "$i"; done
exit status 1

exit status 1

感谢您的宝贵时间。

最佳答案

exec.Command() 将要求内核直接执行给定的进程。但是,您传递的命令是由 shell 脚本连接在一起的一串多个程序。

如果你想执行一个shell脚本,你应该使用这样的东西:

cmd := exec.Command("/bin/sh", "-c", "sudo find ...")

关于go - Go中的Os Exec Sudo命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com