首頁 >後端開發 >Golang >如何在不使用 su 或 bash 的情況下以 Go 中的另一個使用者身分執行外部命令?

如何在不使用 su 或 bash 的情況下以 Go 中的另一個使用者身分執行外部命令?

Linda Hamilton
Linda Hamilton原創
2024-12-24 02:56:10895瀏覽

How to Run External Commands as Another User in Go Without Using su or bash?

使用 os/exec 以另一個使用者身分執行外部命令

在 Go 中,os/exec 套件提供了從程式執行外部命令的方法。但是,預設情況下,命令以與程式本身相同的使用者權限運行。

以不同使用者身分執行指令(不含 su/bash)

以不同使用者權限執行指令無需求助於 su 或 bash 指令,您可以使用 syscall.Credential。以下是範例:

import (
    "os/exec"
    "syscall"
)

func runAsUser(command string, args []string, username string) error {
    // Look up the target user's UID and GID
    u, err := user.Lookup(username)
    if err != nil {
        return err
    }

    uid, err := strconv.Atoi(u.Uid)
    if err != nil {
        return err
    }
    gid, err := strconv.Atoi(u.Gid)
    if err != nil {
        return err
    }

    // Create a command and set its SysProcAttr to run as the specified user
    cmd := exec.Command(command, args...)
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Credential: &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)},
    }

    // Run the command
    return cmd.Run()
}

使用 Setuid 的替代方法(不建議)

雖然由於潛在的安全風險而不推薦,但您也可以使用 syscall.Setuid 更改有效用戶ID目前的

import (
    "os"
    "syscall"
)

func setUid(username string) error {
    // Look up the target user's UID
    u, err := user.Lookup(username)
    if err != nil {
        return err
    }

    uid, err := strconv.Atoi(u.Uid)
    if err != nil {
        return err
    }

    // Set the effective user ID to the specified user
    return syscall.Setuid(uid)
}

注意:

  • 上述範例假設目前行程以具有適當 su 權限的 root 身分運作。
  • 如果需要將環境變數傳遞給子進程,可以使用Cmd.Env.
  • 處理整個過程中可能出現的任何錯誤至關重要。

以上是如何在不使用 su 或 bash 的情況下以 Go 中的另一個使用者身分執行外部命令?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn