【发布时间】:2016-01-06 09:56:35
【问题描述】:
这不是一个特定于语言的问题,尽管我目前使用的是 golang。
我正在编写一个命令行程序,我想找到程序的真实 UID。(我的真实 UID 是指,如果用户执行 sudo,则有效 uid 会发生变化,但真实 uid 将是相同的作为用户的。)
我读过找到控制 tty 的所有者是找到它的一种方法,在 linux 上,我们可以使用“tty”命令,它将返回连接到 STDINPUT 的终端的文件名。检查其所有权是一种方法。
另一种方法是找到会话领导进程,以及谁拥有它。
我尝试了第一种方法,使用
cmdOut []byte
cmdOut, _ = exec.Command("tty").Output()
但当我从 shell 运行程序时,它会返回输出 not a tty。很有可能这可能会在与 tty 分离的单独的分叉 shell 中执行(再次,只是一个疯狂的猜测)。
我尝试使用os.Getppid()获取父pid的第二种方法,但实际上,当运行sudo时,它再次分叉,并且它给出了sudo进程的父pid(在以下情况下为16031,而我希望抓住3393。)。 (从 pstree 输出粘贴进程层次结构)
/usr/bin/termin(3383)-+-bash(3393)---sudo(16031)---Myprogram(16032),所以实际上我无法获得会话领导进程,而只能获得父 pid。
有人可以指导我如何使用这两种方法实现此功能吗?
【问题讨论】:
-
查看手册页:
man 7 credentials。有段User and group identifiers。 -
你不能用
getuid()吗? -
@SergeyKanaev 谢谢,让我探索一下选项,如果我可以通过系统调用来完成,那可能会有所帮助。
-
@IanAbbott 不。这将为您提供有效的 uid,并且在您使用 sudo 时会发生变化。我想得到真正的 uid。