通过sudo来识别当前用户的最可靠的方法

我有一个应用程序,可能会或可能不会运行,而用户被sudo'ed共享用户帐户。 我想可靠地确定谁是真正的用户是一种“荣誉系统”ACL。 我认为通过追踪父/组/会话进程ID, pstree命令的方式有一些方法,但我不知道如何做到最好,或者如果有更好的select。

我最初尝试getlogin() 。 如果使用./myapp ,那么这将起作用,但是它会失败,并input'cat input | 。/ myapp“(因为”控制terminal“是共享帐户拥有的pipe道)。

我宁愿不相信环境variables,因为我不希望我的“荣誉系统”被一个简单的未unset完全挫败,当信息在其他地方仍然可用时。

我也想避免强制在密码数据库中查找,因为这是一个远程RPC(NIS或LDAP),我非常确定wtmp已经包含我需要的信息。

对于一个shell脚本,你可以用它来获取sudo'ing用户:

 WHO=$(who am i | sed -e 's/ .*//'`) 

并从登录中提取id使用:

 ID_WHO=$(id -u $WHO) 

稍后我会发现C库相当于。

sudo设置环境变量SUDO_USERSUDO_UIDSUDO_GID

你可以用这个来测试

 $ sudo env [sudo] password for shteef: TERM=xterm # [...snip...] SHELL=/bin/bash LOGNAME=root USER=root USERNAME=root SUDO_COMMAND=/usr/bin/env SUDO_USER=shteef SUDO_UID=1000 SUDO_GID=1000 

但是,如果你的用户在共享帐户上有外壳访问,那么我想你也不能盲目地相信这个。

怎么样:

 #!/usr/bin/ksh username=`id | cut -d"=" -f2 | cut -d" " -f1` if [ $username == "0(root)" ] then print "Yes, the user is root" else print "Sorry! the user $username, is not a root" fi