首页 文章

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

提问于
浏览
3

这不是特定于语言的问题,尽管我现在正在使用golang .

我正在编写一个命令行程序,我想找到该程序的真正UID . (通过realUID,我的意思是,如果用户做了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 在下面的情况下,而我想 grab 3393 代替 . ) . (从pstree输出粘贴进程层次结构) /usr/bin/termin(3383)-+-bash(3393)---sudo(16031)---Myprogram(16032) ,所以实际上我无法获得会话引导进程,而只是父进程pid .

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

1 回答

  • 2

    编辑:sudo set的 $SUDO_USER 环境变量,但它只能帮助一个sudo,即如果有 sudo sudo -u nobody your-program 之类的东西, $SUDO_USER 将被设置为"root" . 而且还有 $SUDO_UID .

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

相关问题