如果程序是用sudo运行的,如何让用户获得真正的uid?

时间:2012-04-22 22:44:34

标签: c ubuntu

我正在运行的程序需要root权限,因此运行sudo,但它还需要知道用户正在运行它。 getuidgeteuid都返回root。如何获取实际用户的用户名(或uid)?

谢谢!

4 个答案:

答案 0 :(得分:17)

sudo提供了一些环境变量来帮助您完成这种情况:

   SUDO_UID        Set to the user ID of the user who invoked
                   sudo

   SUDO_USER       Set to the login of the user who invoked sudo

steveayre在评论中指出用户可以在某些情况下设置这些环境变量; sudo(8)联机帮助页包含部分内容:

The sudoers policy subjects variables
passed on the command line to the same restrictions as normal
environment variables with one important exception.  If the
setenv option is set in sudoers, the command to be run has the
SETENV tag set or the command matched is ALL, the user may set
variables that would otherwise be forbidden.  See sudoers(5)
for more information.

因此,当您需要依赖此功能时,请确保不向用户授予ALL命令。

答案 1 :(得分:3)

审计系统提供的特定于Linux的audit_getloginuid()功能可以提供帮助;由于pam_loginuid(8)仅为“主”守护进程(sshdlogingdm等安装,因此{{1}时审核uid将保持不变执行。

这需要一点配置;添加:

sudo(8)

session required pam_loginuid.so 文件 - 以及您允许用户使用的其他服务。

确保/etc/pam.d/sshd配置文件中未加载pam_loginuid.so

答案 2 :(得分:2)

你有两个不错的选择......

  1. 信任sudo并使用其环境
  2. 让你的程序setuid-on-execution,然后geteuid等,将会正常工作
  3. 更新

    The setuid bit 是文件模式下的访问权限标志,导致程序使用可执行文件所有者的功能运行。这就是sudo(1)能够以root身份运行的方式...... sudo程序本身就具有这种模式。

    $ ls -l /usr/bin/sudo
    -r-s--x--x  1 root  wheel  272384 Jun 22  2009 /usr/bin/sudo*
    

    要创建程序setuid root,可以:

    $ chown root a.out
    $ chmod +s a.out
    

    毋庸置疑,应该仔细编写setuid root程序。如果您只需要访问受保护的目录或文件,则可以将setuid设置为权限较低的用户。

答案 3 :(得分:0)

更简单的方法是使用“我是谁”

who am i | awk '{print $1}'

who am i | cut -f1 -d" "