> 백엔드 개발 > Golang > os/exec를 사용하여 Go에서 다른 사용자로 외부 명령을 어떻게 실행할 수 있나요?

os/exec를 사용하여 Go에서 다른 사용자로 외부 명령을 어떻게 실행할 수 있나요?

Barbara Streisand
풀어 주다: 2024-12-20 06:18:10
원래의
271명이 탐색했습니다.

How Can I Execute External Commands as a Different User in Go Using os/exec?

os/exec를 사용하여 다른 사용자로 외부 명령 실행

특정 사용자로 외부 명령을 실행하는 것은 시스템 관리 및 애플리케이션 개발. Go에서 os/exec 패키지는 외부 명령을 실행하기 위한 편리한 인터페이스를 제공하지만 일반적으로 현재 사용자의 권한으로 실행합니다. 이는 특히 "su" 또는 "bash"와 같은 외부 도구에 의존하지 않고 다른 사용자로 명령을 실행해야 할 때 문제가 될 수 있습니다.

이 문제를 해결하기 위해 os/exec는 syscall을 사용하여 솔루션을 제공합니다. .Credential 구조체. 외부 명령을 실행해야 하는 사용자 ID 및 그룹 ID를 지정하기 위해 Cmd.SysProcAttr 필드에 추가할 수 있습니다. 구현 방법은 다음과 같습니다.

import (
    "fmt"
    "os/exec"
    "syscall"
    "strconv"
    "user"
)

func RunExternalCommandAsUser(username, command string, args ...string) error {
    // Lookup the user by name
    u, err := user.Lookup(username)
    if err != nil {
        return fmt.Errorf("failed to lookup user %s: %v", username, err)
    }

    // Convert the UID to an integer
    uid, err := strconv.Atoi(u.Uid)
    if err != nil {
        return fmt.Errorf("failed to convert UID to integer: %v", err)
    }

    // Create a new command object
    cmd := exec.Command(command, args...)

    // Set the SysProcAttr field with the Credential struct
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Credential: &syscall.Credential{Uid: uid, Gid: -1}, // -1 indicates to keep the current group
    }

    // Execute the command
    err = cmd.Run()
    if err != nil {
        return fmt.Errorf("failed to execute command: %v", err)
    }

    return nil
}
로그인 후 복사

이 함수는 사용자 이름, 외부 명령 및 모든 인수를 입력으로 사용하고 지정된 사용자 권한으로 명령을 실행합니다. 기본 Go 프로세스의 사용자 권한을 수정하지 않고 외부 프로세스가 의도된 사용자로 실행되도록 보장합니다.

위 내용은 os/exec를 사용하여 Go에서 다른 사용자로 외부 명령을 어떻게 실행할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿