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

时间:2015-04-19 17:50:51

标签: go sudo username

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

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

在GoLang中是否有办法拉动在sudo下运行应用程序的用户? (转到1.4.2,在OS X 10.10.3上运行)

3 个答案:

答案 0 :(得分:6)

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

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

您可能只想在以root身份运行时才信任这些变量,即如果os.Geteuid()返回0

答案 1 :(得分:4)

由于任何人都可以设置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)
}

答案 2 :(得分:1)

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

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