如何使用 Golang 查找以 root 身份执行程序的用户?

How to find the user that executed a program as root using Golang?

我正在创建一个小程序,需要对低于 1024 的网络端口进行特权访问,因此它使用 sudo 运行。

如果该实用程序需要做的部分工作需要知道调用该应用程序的用户是谁,我将需要一种方法来查询实际用户是谁;使用 OS/user 方法让用户指向“系统管理员”或其他根用户,因为它在 sudo 上下文中 运行。

GoLang 有没有办法拉取 运行 sudo 下的应用程序的用户? (转到 1.4.2,运行 在 OS X 10.10.3 上)。

sudo 为此创建 SUDO_UID/SUDO_GIDSUDO_USER 环境变量,其中包含调用 sudo 的帐户的用户 ID、组 ID 和用户名。参见例如here

因此在 Go 中,您可以使用 os.Getenv() 读取这些环境变量。

您可能希望仅在 运行 作为 root 时才信任这些变量,即如果 os.Geteuid() returns 0

由于任何人都可以设置 SUDO_UIDSUDO_GIDSUDO_USER,攻击者可以自行导出这些设置并绕过您尝试实施的安全措施。

我找到的方法是找到您当前 运行 的 Go 程序的 pid,获取拥有该 pid 的用户的名称,然后检查它是否 root.

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

func main() {
    if getProcessOwner() == "root" {
        fmt.Println("You're sudo!")
    }
}

func getProcessOwner() string {
    stdout, err := exec.Command("ps", "-o", "user=", "-p", strconv.Itoa(os.Getpid())).Output()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    return string(stdout)
}

这是我在最新的 Golang 版本 go1.16.1 中检查当前用户是否 root 的方法:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func isRoot() bool {
    currentUser, err := user.Current()
    if err != nil {
        log.Fatalf("[isRoot] Unable to get current user: %s", err)
    }
    return currentUser.Username == "root"
}

func main() {   
    fmt.Printf("Am I root? %v", isRoot())

}

https://play.golang.org/p/tRMR5IW6GAc