我正在创建一个小程序,需要对1024以下的网络端口进行特权访问,因此它与sudo一起运行。
如果实用程序需要做的部分工作需要知道调用应用程序的用户是谁,我需要一种方法来查询实际用户是谁;使用os / user方法让用户指向“系统管理员”或其他root用户,因为它在sudo上下文中运行。
在GoLang中是否有办法拉动在sudo下运行应用程序的用户? (转到1.4.2,在OS X 10.10.3上运行)
答案 0 :(得分:6)
sudo为此创建SUDO_UID
/ SUDO_GID
和SUDO_USER
环境变量,其中包含调用sudo的帐户的用户ID,组ID和用户名。参见例如here
因此,在Go中,您可以使用os.Getenv()读取这些环境变量。
您可能只想在以root身份运行时才信任这些变量,即如果os.Geteuid()返回0
答案 1 :(得分:4)
由于任何人都可以设置SUDO_UID
,SUDO_GID
和SUDO_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())
}