在Linux中查找会话负责人或控制进程组TTY的方法有哪些?

时间:2016-01-06 09:56:36

标签: c linux bash shell go

这不是特定语言的问题,虽然我现在正在使用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 in以下情况,而我希望获取3393。)。 (从pstree输出粘贴进程层次结构) /usr/bin/termin(3383)-+-bash(3393)---sudo(16031)---Myprogram(16032),因此我无法获得会话领导流程,只能访问父pid。

有人可以指导我如何使用此方法之一实现此功能?

1 个答案:

答案 0 :(得分:2)

编辑: sudo设置了$SUDO_USER环境变量,但它只对一个sudo有帮助,即如果有sudo sudo -u nobody your-program之类的内容,$SUDO_USER将被设置为" root&# 34 ;.还有$SUDO_UID

旧答案:exec.Command("who am i").Output()怎么样? (不会工作,仍需要一个tty)。