我有一个应用程序可能会或可能不会在用户被分享到共享用户帐户时运行。我想要可靠地确定真正的用户是谁用于某种“荣誉系统”ACL。我认为有一些方法可以跟踪父/组/会话进程ID pstree
命令的方式,但我不确定如何做到最好或者有更好的选择。
我原本试过getlogin()
。如果使用./myapp
,则有效,但是在'cat input |中失败./ myapp`(因为“控制终端”是共享帐户拥有的管道。)
我宁愿不信任环境变量,因为我不希望我的“荣誉系统”被简单的unset
完全挫败,当信息在其他地方仍然可用时。
我还想避免在密码数据库中强制查找,因为这是一个远程RPC(NIS或LDAP),我很确定wtmp
已经包含了我需要的信息。
答案 0 :(得分:2)
对于shell脚本,您可以使用它来获取sudo'ing用户:
WHO=$(who am i | sed -e 's/ .*//'`)
使用以下命令从登录名中提取ID:
ID_WHO=$(id -u $WHO)
我稍后会发现C库的等价物。
答案 1 :(得分:1)
sudo
设置环境变量SUDO_USER
,SUDO_UID
和SUDO_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 :(得分: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