这不是一个语言特定的问题,虽然我现在正在使用golang。
我正在编写一个命令行程序,我想find程序的真实UID(realUID,我的意思是,如果用户做了一个sudo,那么有效的uid会改变,但是真正的uid将和用户的。)
我读过,发现控制tty的所有者是find这个的一种方法,在linux上,我们可以使用“tty”命令,它将返回连接到STDINPUT的terminal的文件名。 检查它的所有权是一种方法。
另一种方法是find会议领导者进程,以及谁拥有它。
我尝试了第一种方式,使用
cmdOut []byte cmdOut, _ = exec.Command("tty").Output()
但是当我从我的shell运行程序时,它返回的输出not a tty
。 机会是,这可能会得到执行在一个单独的分支shell从tty分离(再次,只是一个疯狂的猜测)。
我尝试了使用os.Getppid()
来获得父pid的第二种方式,但实际上,在运行sudo的时候,它又分叉了,它给出了sudo进程的父pid( 16031
在下面的例子中,而我想抓住3393
)。 (从pstree输出粘贴进程层次结构) /usr/bin/termin(3383)-+-bash(3393)---sudo(16031)---Myprogram(16032)
,所以我无法获得会话领导过程,但只是父母的PID。
有人可以指导我如何使用这种方法来实现此function?
编辑:sudo set的$SUDO_USER
环境变量,但它将帮助只有一个sudo,即如果有像sudo sudo -u nobody your-program
, $SUDO_USER
将被设置为“root”。 还有$SUDO_UID
。
老答案: exec.Command("who am i").Output()
? (不会工作,仍然需要一个tty)。