在Linux中find会话负责人或进程组的控制TTY的方法是什么?

这不是一个语言特定的问题,虽然我现在正在使用golang。

我正在编写一个命令行程序,我想find程序的真实UID(realUID,我的意思是,如果用户做了一个sudo,那么有效的uid会改变,但是真正的uid将和用户的。)

我尝试了第一种方式,使用

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)。