![查找未登录用户的命令](https://linux22.com/image/35522/%E6%9F%A5%E6%89%BE%E6%9C%AA%E7%99%BB%E5%BD%95%E7%94%A8%E6%88%B7%E7%9A%84%E5%91%BD%E4%BB%A4.png)
有没有什么命令可以查看未登录系统的用户数量?
我正在尝试编写一个 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
您也可以放弃使用grep
并join
改为使用,因为此类问题更多的是在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
是两个列表都需要排序,因此我们必须添加| sort
to 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