我正在寻找一个/ etc / passwd文件,并且只取出一系列UID中的用户。我对功能似乎不太满意。
我发现了以下功能,但似乎无法使其正常工作。 来自how to make PHP lists all Linux Users?
function getUsers() {
$result = [];
/** @see http://php.net/manual/en/function.posix-getpwnam.php */
$keys = ['name', 'passwd', 'uid', 'gid', 'gecos', 'dir', 'shell'];
$handle = fopen('/etc/passwd', 'r');
if(!$handle){
throw new \RuntimeException("failed to open /etc/passwd for reading! ".print_r(error_get_last(),true));
}
while ( ($values = fgetcsv($handle, 1000, ':')) !== false ) {
$result[] = array_combine($keys, $values);
}
fclose($handle);
return $result;
}
现在,我相信我只需要将该函数放在页面中,然后再用
进行调用getUsers()
但是,这仍然不是一个完整的解决方案,只是一部分,因为我然后需要获取在$ min和$ max范围内的UID,但是如果我无法通过上述步骤,则很难继续做下去。让用户在上述范围内。
也许有更好的方法可以做到这一点?
更新---------------------------
我有这部分,我不好
现在我需要解析/ etc / passwd文件
(反对者走开了,我不需要您的安全性讲座,因为/ etc / passwrd中没有密码。如果您对安全性有所了解,就会知道!)
文件看起来像这样
[24] => Array
(
[name] => lightdm
[passwd] => x
[uid] => 107
[gid] => 115
[gecos] => Light Display Manager
[dir] => /var/lib/lightdm
[shell] => /bin/false
)
[25] => Array
(
[name] => kodi
[passwd] => x
[uid] => 1000
[gid] => 1000
[gecos] => ,,,
[dir] => /home/kodi
[shell] => /bin/bash
)
[26] => Array
(
[name] => saned
[passwd] => x
[uid] => 108
[gid] => 119
[gecos] =>
[dir] => /var/lib/saned
[shell] => /bin/false
)
[27] => Array
(
[name] => statd
[passwd] => x
[uid] => 109
[gid] => 65534
[gecos] =>
[dir] => /var/lib/nfs
[shell] => /bin/false
)
[28] => Array
(
[name] => sshd
[passwd] => x
[uid] => 110
[gid] => 65534
[gecos] =>
[dir] => /var/run/sshd
[shell] => /usr/sbin/nologin
)
[29] => Array
(
[name] => pulse
[passwd] => x
[uid] => 111
[gid] => 121
[gecos] => PulseAudio daemon,,,
[dir] => /var/run/pulse
[shell] => /bin/false
)
[30] => Array
(
[name] => rtkit
[passwd] => x
[uid] => 112
[gid] => 123
[gecos] => RealtimeKit,,,
[dir] => /proc
[shell] => /bin/false
)
[31] => Array
(
[name] => avahi
[passwd] => x
[uid] => 113
[gid] => 124
[gecos] => Avahi mDNS daemon,,,
[dir] => /var/run/avahi-daemon
[shell] => /bin/false
)
[32] => Array
(
[name] => hplip
[passwd] => x
[uid] => 114
[gid] => 7
[gecos] => HPLIP system user,,,
[dir] => /var/run/hplip
[shell] => /bin/false
)
[33] => Array
(
[name] => spanish
[passwd] => x
[uid] => 1001
[gid] => 1001
[gecos] => spanish,,,,
[dir] => /home/spanish
[shell] => /bin/bash
)
我认为,最有效的方法是在创建新数组后解析文件。我设置了一个$ minuid和$ maxuid来基于'uid'键选择我想要的用户。
我需要返回的是一个较小的数组,只有那些UID在$ maxuid和$ minuid之间的用户才能轻松地为那些相关用户获取'name'和'dir'字段。
我似乎对如何做到这一点迷失了。
答案 0 :(得分:0)
首先,任何想抱怨安全性的人都需要考虑以下内容:
/etc/passwd
是世界可读的。这是文件的必需状态。
如果这是新事物和/或使您感到惊讶,那么您需要重新了解基本的安全性和Linux管理。
OP,您将要使用array_filter()
,例如:
$min = 500;
$max = 1000;
$filtered_users = array_filter(
$input,
function($a) use ($min, $max) {
return $a['uid'] >= $min && $a['uid'] <= $max;
}
);