解析/ etc / passwd文件以获取范围内的用户ID,并获取用户名和路径

时间:2019-03-18 19:04:11

标签: php passwd

我正在寻找一个/ 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'字段。

我似乎对如何做到这一点迷失了。

1 个答案:

答案 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;
    }
);