2010-02-06 91 views
3

我有一个应用程序,可以在用户被分享到共享用户帐户时运行,也可以不运行。我想要可靠地确定谁是真正的用户对于某种“荣誉系统”ACL。我认为通过跟踪父/组/会话进程id,pstree命令可以实现某种方式,但我不确定如何做到最好,或者是否有更好的替代方法。我最初试过getlogin()。如果使用./myapp,则该方法有效,但会失败,并显示'cat input | 。/ myapp`(因为“控制终端”是共享帐户拥有的管道)。通过sudo识别当前用户的最可靠方法

我宁可不相信环境变量,因为我不希望我的“荣誉系统”完全受到unset的阻碍,当时信息在别处仍然可用。

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

回答

1

sudo设置环境变量SUDO_USER,SUDO_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 

但是,如果你的用户对共享帐户shell访问,那么我想你不能盲目信任任何此。

2

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

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

,并使用提取的登录的ID:

ID_WHO=$(id -u $WHO) 

我会揪出C库相当于稍后。

1

如何:

#!/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