Home >Backend Development >Golang >Is it possible to run sudo commands in go without running the program itself as sudo

Is it possible to run sudo commands in go without running the program itself as sudo

WBOY
WBOYforward
2024-02-09 18:03:081302browse

是否可以在 go 中运行 sudo 命令而不将程序本身作为 sudo 运行

php Editor Banana is here to answer a question about the Go language: Is it possible to run the sudo command in Go without running the program itself as sudo? In the Go language, by using the Command function in the os/exec package, we can execute system commands, including sudo commands, in the program. However, it should be noted that if you want to execute sudo commands in a Go program, the program itself must have sudo permissions. Otherwise, the program will not be able to successfully execute the sudo command. Therefore, if you wish to execute sudo commands in a Go program, it is very important to ensure that the program itself has sudo permissions.

Problem content

This program runs multiple commands that require sudo permissions (such as sudo dnf update). Since the program should be installed using the go install command, it cannot be run as sudo without a user completing the configuration (as far as I know).

The program does not display output to the user to keep the output clean. To show that a process is running, it uses spinners from the spinner library.

Can I do these things?

  • Get sudo permissions from within the program
  • Make the program runable via sudo, even if it was installed using go install
  • Show the output of sudo commands (including password requests) without being overwritten by the spinner

Here is a simplified version of what I want the code to do:

package main

import (
    "fmt"
    "os"
    "os/exec"
    "time"

    "github.com/briandowns/spinner"
)

func main() {
    // Spinner to show that it's running
    s := spinner.New(spinner.CharSets[14], time.Millisecond*100)
    s.Start()

    // Somehow execute this with sudo
    _, err := exec.Command(os.Getenv("SHELL"), "-c", "dnf update -y").Output()

    // Stop the spinner and handle any error
    if err != nil {
        fmt.Printf("Err: %s", err)
        os.Exit(1)
    }
    s.Stop()

    // Finish
    fmt.Println("Success")
}

Solution

_, err := exec.Command(os.Getenv("SHELL"), "-c", "sudo dnf update -y"). Output()

In this example, add sudo before the command you want to run as sudo and after running the program, you will be asked for the password for sudo, If you apply this to the example code, You won't see the password request message because rotating the graphic will overwrite it, but if you try this without rotating the graphic you can see it. Even if you don't see the message, if you enter the correct password and press Enter, your command will work like this sudo. This way you don't need to run the application as sudo. I've run similar commands using it and they work.

The above is the detailed content of Is it possible to run sudo commands in go without running the program itself as sudo. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete