查找未登录用户的命令

查找未登录用户的命令

有没有什么命令可以查看未登录系统的用户数量?

我正在尝试编写一个 shell 脚本来计算已登录的用户数和未登录的用户数。

答案1

列出用户组

您可以使用以下命令获取所有本地用户的列表:

$ getent passwd | awk -F: '{print $1}'

笔记: getent将返回本地用户,假设您没有sssd(或者运行一些类似的服务来拉动 LDAP 用户)并且您的/etc/nsswitch.conf权限仅限于文件,即它不包括 NIS 或 NIS+ 等内容。对于纯本地用户,您只能求助于awk -F: '{print $1}' /etc/passwd.

当前登录者的列表:

$ who

当前未登录的用户列表:

$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}')

最后一个获取已登录用户的列表,并使用 来显示所有用户减去已登录用户的列表grep -vf

获取计数

要获得计数,只需wc -l在命令末尾加上 on 即可。

未登录
$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}') | wc -l
53
登录
$ who | awk '{print $1}' | sort -u | wc -l
1

grep 标志

-F, --fixed-strings
        Interpret PATTERN as a list of fixed strings, separated by newlines, 
        any of which is to be matched.

-x, --line-regexp
        Select only those matches that exactly match the whole line.

-v, --invert-match
        Invert the sense of matching, to select non-matching lines.

-f FILE, --file=FILE
        Obtain patterns from FILE, one per line.  The empty file contains 
        zero patterns, and therefore matches nothing.

使用 join 代替 grep

您也可以放弃使用grepjoin改为使用,因为此类问题更多的是在join的驾驶室中。我们需要使用join -v 2这意味着我们要排除匹配项并仅显示第二个参数 中的唯一项getent ...

加入手册页
-a FILENUM
        also print unpairable lines from file FILENUM, where FILENUM is 
        1 or 2, corresponding to FILE1 or FILE2

-v FILENUM
        like -a FILENUM, but suppress joined output lines


$ join -v 2 <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}' | sort) | wc -l
53

笔记:使用的唯一警告join是两个列表都需要排序,因此我们必须添加| sortto getent ...

答案2

这一行将起作用:

grep -Ev $(users | sed 's/ /|/g') /etc/passwd | awk -F: {'print $1'}

怎么运行的:

的输出users | sed 's/ /|/g'将为您提供一个|单独的登录用户列表。

grep选项-E将允许我们使用多个字符串(在 OR 条件下)进行匹配。该-v选项将打印出与给定字符串/模式不匹配的内容。将 -E 和 组合-v在一起将列出 的输出中不包含管道分隔字符串的所有行users | sed 's/ /|/g'。最后用于awk仅过滤掉用户名。

答案3

您可能需要编写一个脚本,将当前登录的用户数存储在一个文件中,将用户总数存储在另一个文件中,并对comm它们进行处理。

例如:

#!/bin/bash

w | awk 'NR > 2 {print $1}' | sort > logged.txt #sorted list of logged users
awk -F':' '{ print $1}' /etc/passwd | sort > allusers.txt #sorted list of all users
comm -23 allusers.txt logged.txt #find lines unique to allusers.txt

相关内容