【问题标题】:What are the ways to find the session leader or the controlling TTY of a process group in Linux?在 Linux 中找到进程组的会话负责人或控制 TTY 的方法有哪些?
【发布时间】:2016-01-06 09:56:35
【问题描述】:

这不是一个特定于语言的问题,尽管我目前使用的是 golang。

我正在编写一个命令行程序,我想找到程序的真实 UID。(我的真实 UID 是指,如果用户执行 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,而我希望抓住3393。)。 (从 pstree 输出粘贴进程层次结构) /usr/bin/termin(3383)-+-bash(3393)---sudo(16031)---Myprogram(16032),所以实际上我无法获得会话领导进程,而只能获得父 pid。

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

【问题讨论】:

  • 查看手册页:man 7 credentials。有段User and group identifiers
  • 你不能用getuid()吗?
  • @SergeyKanaev 谢谢,让我探索一下选项,如果我可以通过系统调用来完成,那可能会有所帮助。
  • @IanAbbott 不。这将为您提供有效的 uid,并且在您使用 sudo 时会发生变化。我想得到真正的 uid。

标签: c linux bash shell go


【解决方案1】:

编辑: sudo set 的$SUDO_USER 环境变量,但它只对一个sudo 有帮助,即如果有类似sudo sudo -u nobody your-program 的东西,$SUDO_USER 将被设置为“root”。还有$SUDO_UID

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

【讨论】:

  • 这将为您提供有效的 uid,而不是真正的 uid。为此,我可以使用os.Getuid
  • 你是舒尔吗?当我运行 sudo id 时,它会显示 root id,但如果我运行 sudo who am i,它会显示实际运行 sudo 的用户的 id,即使是通过一系列不同的 sudo。
  • 是的。检查了它。 [scott@workbench scripts]$ sudo whoami root [scott@workbench scripts]$ whoami scott
  • 不是whoami,因为我用空格写了who am i
  • 它在 cmd 中工作,但正如我在命令 tty 中提到的那样,这可能会在与 tty 分离的单独的分叉 shell 中执行(再次,只是一个疯狂的猜测) 并且在放入程序时不返回值,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多