查找在sudo(GoLang)下运行时执行程序的用户

Bar*_*rim 4 sudo go username

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

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

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

nos*_*nos 8

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

所以在Go中你可以用os.Getenv()读取那些环境变量.

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

  • 请记住,可以覆盖或伪造这些变量。 (5认同)

Alf*_*rga 7

以下是我检查当前用户是否root使用最新 Golang 版本的方法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())

}
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*nte 5

由于任何人都可以设置SUDO_UID,SUDO_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)
}
Run Code Online (Sandbox Code Playgroud)