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

Linux 通过sudo识别当前用户的最可靠方法,linux,process,sudo,Linux,Process,Sudo,我有一个应用程序,当用户使用共享用户帐户时,它可能会运行,也可能不会运行。我想可靠地确定谁是某种“荣誉系统”ACL的真正用户。我认为有一些方法可以像pstree命令那样跟踪父/组/会话进程ID,但我不确定如何做到最好,或者是否有更好的替代方法 我最初尝试了getlogin()。如果使用了/myapp,则该方法有效,但在使用“cat input |./myapp”时失败(因为“控制终端”是共享帐户拥有的管道) 我宁愿不相信环境变量,因为我不希望我的“荣誉体系”被一个简单的未设置的完全破坏,而此时信

我有一个应用程序,当用户使用共享用户帐户时,它可能会运行,也可能不会运行。我想可靠地确定谁是某种“荣誉系统”ACL的真正用户。我认为有一些方法可以像
pstree
命令那样跟踪父/组/会话进程ID,但我不确定如何做到最好,或者是否有更好的替代方法

我最初尝试了
getlogin()
。如果使用了
/myapp
,则该方法有效,但在使用“cat input |./myapp”时失败(因为“控制终端”是共享帐户拥有的管道)

我宁愿不相信环境变量,因为我不希望我的“荣誉体系”被一个简单的
未设置的
完全破坏,而此时信息仍然可以在其他地方获得


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

sudo
设置环境变量
sudo\u USER
sudo\u UID
,以及
sudo\u 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访问权限,那么我想您也不能盲目相信这一点。

对于shell脚本,您可以使用它来获取sudo'ing用户:

WHO=$(who am i | sed -e 's/ .*//'`)
并使用以下命令从登录中提取id:

ID_WHO=$(id -u $WHO)
稍后我将找出与C库等效的代码。

如何:

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