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

标签 linux bash unix ubuntu

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

谢谢。

最佳答案

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

计算主目录

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

ls /home | wc -l

合理的近似值。

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

关于Linux BASH脚本确定登录用户数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28208069/

相关文章:

ruby-on-rails - bundler 问题( ruby )

c - 如何从 bash 向 C 程序提供输入?

linux - for循环与来自变量的bash

linux - unix shell脚本合并多行

c - 为什么 pthread_join() 不挂起主线程?

c - 自动执行 C 程序的用户输入

Java JList 右键单击​​ Linux (Ubuntu 12.04) 没有显示菜单

c++ - 测试C++代码的性能

bash - 如何限制日志文件中的最大行数

r - 有没有办法将 R 对象传输到 Linux 上的单独 R session ?