>백엔드 개발 >Golang >프로그램 자체를 sudo로 실행하지 않고 go에서 sudo 명령을 실행할 수 있습니까?

프로그램 자체를 sudo로 실행하지 않고 go에서 sudo 명령을 실행할 수 있습니까?

WBOY
WBOY앞으로
2024-02-09 18:03:081302검색

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

php 편집기 Banana는 Go 언어에 대한 질문에 답하기 위해 왔습니다. 프로그램 자체를 sudo로 실행하지 않고도 Go에서 sudo 명령을 실행할 수 있습니까? Go 언어에서는 os/exec 패키지의 Command 함수를 사용하여 프로그램에서 sudo 명령을 포함한 시스템 명령을 실행할 수 있습니다. 그러나 Go 프로그램에서 sudo 명령을 실행하려면 프로그램 자체에 sudo 권한이 있어야 합니다. 그렇지 않으면 프로그램이 sudo 명령을 성공적으로 실행할 수 없습니다. 따라서 Go 프로그램에서 sudo 명령을 실행하려면 프로그램 자체에 sudo 권한이 있는지 확인하는 것이 매우 중요합니다.

질문 내용

이 프로그램은 sudo 권한이 필요한 여러 명령(예: sudo dnf update)을 실행합니다. 프로그램은 go install 명령을 사용하여 설치해야 하므로 사용자가 구성을 완료하지 않으면 sudo로 실행할 수 없습니다(내가 아는 한).

프로그램은 출력을 깔끔하게 유지하기 위해 사용자에게 출력을 표시하지 않습니다. 프로세스가 실행 중임을 표시하기 위해 스피너 라이브러리의 스피너를 사용합니다.

이런 일을 할 수 있나요?

  • 프로그램 내에서 sudo 권한을 얻으세요
  • go install
  • 를 사용하여 설치한 경우에도 sudo를 통해 프로그램을 실행 가능하게 만듭니다.
  • 스피너에 의해 재정의되지 않고 sudo 명령(비밀번호 요청 포함)의 출력을 표시합니다

다음은 코드에서 수행하려는 작업의 단순화된 버전입니다.

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")
}

솔루션

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

이 예시에서는 sudo로 실행하려는 명령어 앞에 sudo를 추가하고 프로그램 실행 후 sudo에서 비밀번호를 묻는 메시지가 나오며, 이것을 예시 코드에 적용하면 Rotating이기 때문에 비밀번호 요청 메시지가 표시되지 않습니다. 모양이 덮어쓰게 되지만, 모양을 회전하지 않고 시도하면 볼 수 있습니다. 메시지가 보이지 않더라도 올바른 비밀번호를 입력하고 Enter 키를 누르면 sudo에서 명령이 이렇게 작동합니다. 이렇게 하면 애플리케이션을 sudo로 실행할 필요가 없습니다. 나는 그것을 사용하여 비슷한 명령을 실행했으며 작동했습니다.

위 내용은 프로그램 자체를 sudo로 실행하지 않고 go에서 sudo 명령을 실행할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제