首先,你需要问自己什么样的登录才能拥有“root权限”。据我所知,有两种基本解决方案。
一种是老派的方法,系统管理员创建多个uid为0的账户,我个人认为这种方法是噩梦。在这种情况下,你可以使用posix_getpwnam检查用户列表中的所有用户,并查看其uid是否匹配0。
以下代码段就是这样做的,$privileged将包含具有root权限的用户:
$logins = array('root', 'john', 'guest', 'foo');
$privileged = array();
foreach($logins as $login) {
$userInfo = posix_getpwnam($login);
if ($userInfo !== FALSE) {
if ($userInfo['uid'] == 0) {
$privileged[] = $login;
}
}
}
另一种(也是我认为唯一明智的)做法是将所有具有 root/administrative 权限的用户添加到一个特定的组中(在不同的 Linux 发行版中已经使用了
wheel 或
admin,请找出适合您的那个)。这种情况甚至更简单,因为您可以使用
posix_getgrnam 函数获取特定组中的所有成员。
以下代码片段将匹配您提供的登录名数组,并查看谁是具有特定权限的成员,再次 $privileged 将包含结果(即您列表中属于您指定组的用户)。
$logins = array('root', 'john', 'guest', 'foo');
$privileged = array();
$groupInfo = posix_getgrnam('admins');
if ($groupInfo !== FALSE) {
$privileged = array_intersect($logins, $groupInfo['members']);
}
$username=="root"
是显而易见的选择。我猜你实际上想问的是用户是否在sudoers组中。不确定是否有一种确定性方法。也许可以参考http://stackoverflow.com/questions/1133364/fastest-way-to-determine-user-permissions-in-etc-sudoer - 但最好在Unix.SE上询问--如果您的问题只是将密码传递给管道,请尝试使用proc_open而不是普通的exec。 - mario