[英]What are the ways to find the session leader or the controlling TTY of a process group in Linux?
这不是特定于语言的问题,尽管我现在正在使用golang。
我正在编写一个命令行程序,我想找到该程序的真正UID。(通过realUID,我的意思是,如果用户做了一个sudo,有效的uid会改变,但真正的uid将与用户的相同) 。)
我已经读过,找到控制tty的所有者是找到它的一种方法,在linux上,我们可以使用“tty”命令,它将返回连接到STDINPUT的终端的文件名。 检查其所有权是一种方式。
另一种方法是找到会话领导者流程,谁拥有它。
我尝试了第一种方式,使用
cmdOut []byte
cmdOut, _ = exec.Command("tty").Output()
但是当我从shell运行程序时,它返回的输出not a tty
。 有可能这可能会在一个独立的分叉shell中执行,该分离的shell与tty分离(再次,只是一个疯狂的猜测)。
我尝试使用os.Getppid()
获取父pid的第二种方式,但实际上,当运行sudo时,它再次分叉,并且它给了sudo进程的父pid(在下面的情况下为16031
,而我是寻找3393
代替。) (从pstree输出粘贴进程层次结构) /usr/bin/termin(3383)-+-bash(3393)---sudo(16031)---Myprogram(16032)
,所以实际上我无法获得会话领导过程,但只是父母的pid。
有人可以指导我如何使用这种方法实现此功能?
编辑:sudo set的$SUDO_USER
环境变量,但它只能帮助一个sudo,即如果有类似sudo sudo -u nobody your-program
, $SUDO_USER
将被设置为“root”。 并且还有$SUDO_UID
。
老答案: exec.Command("who am i").Output()
怎么样exec.Command("who am i").Output()
? (不会工作,仍然需要一个tty)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.