Linux BASH脚本确定登录的用户数量?

时间:2015-01-29 06:14:34

标签: linux bash unix ubuntu

我需要帮助编写BASH脚本,通过获取系统密码文件中包含的密码数来确定系统的潜在用户数。     我试过/ etc / passwd。总是说“权限被拒绝”。      以及确定当前登录到系统的用户数的脚本。此脚本将以无人参与的批处理方式运行,除了被调用之外没有键盘的任何输入。

谢谢。

2 个答案:

答案 0 :(得分:5)

TL; DR

您应该使用 who 来计算登录用户,并通过将/ etc / passwd中适当范围内的UID相加来获得更完整的普通用户数(而不是系统帐户)。

计算登录

在Linux上,您可以使用 who 命令计算活动登录(可能包括同一用户的多次登录):

$ who --count
foo bar baz quux
# users=4

您可以按照自己喜欢的方式解析最后一行的总数。一些例子包括:

# Using a Perl-compatible grep.
$ who --count | pcregrep -o 'users=\K.*'
4

# Counting unique logins when *who* doesn't have a --count flag.
$ who | sort --key=1,1 --unique | wc --lines
4

但是有很多方法可以做出真正的规范列表。需要注意的是,如果没有排序,如果该用户一次登录多个TTY或PTY,则可能会多次计算同一个用户。

计算非系统帐户

修复文件系统权限

首先,您需要修复/ etc / passwd上的权限。在支持影子密码的Ubuntu等发行版上,此文件通常设置为模式644。例如:

sudo chmod 644 /etc/passwd

如果您没有sudo访问权限,那么您必须与系统管理员讨论如何更改文件的权限。如果贵公司的安全政策不允许这样做,您可以获得sudo访问权限,以便通过以下方式阅读该文件:

# Allow user "nadh" to print the contents of /etc/passwd as root.
nadh ALL=(root) NOPASSWD: /bin/cat /etc/passwd

这种级别的sudo访问是非常严格的,因为它只允许你捕获一个文件;它甚至不允许你将标志或其他参数传递给cat。

另一种选择是在文件系统上使用扩展属性来授予对特定用户或组的访问权限,但这通常是一种更复杂的方法,并且不具备可移植性。

计算UID

在Ubuntu上,用户帐户的UID范围为1000-65533(65534通常属于 nobody 帐户)。一旦您能够读取/ etc / passwd,您就可以计算允许范围内的所有用户。例如:

awk -F: '$3>=1000 && $3<65534 {i+=1}; END {print i}' /etc/passwd

Count Home Directories

如果您还通过NIS,LDAP或其他非本地查找定义了用户,那么计算UID显然不会准确。作为替代方案,您可以使用以下命令计算本地主目录。

ls /home | wc -l

为合理的近似值。

如果将服务帐户数据存储在/ home而不是/ var或/ srv中,或者如果您使用NFS进行自动安装,则这可能不可靠。你的里程会有所不同。

答案 1 :(得分:0)

检查此命令,我认为确定当前登录的用户数量会很有帮助,

$ who|wc -l

用于丢弃重复的用户会话,并仅计算当前在系统中登录的唯一用户。

$ users | tr ' ' '\n' | sort -u | wc -l