linux中查找所有用户使用的不同shell的分布的命令是什么?
4 回答
getent passwd | awk -F: '{print $7}' | sort | uniq -c
该getent
命令转储密码数据库。通常这只是一个文件,/etc/passwd
但它可以来自其他来源;使用getent passwd
而不仅仅是阅读/etc/passwd
允许这样做。
如果您的系统没有该getent
命令,请找出您的系统对应的命令(也许如果您的系统使用 NIS),或者如果您确定信息没有存储在其他位置,则直接ypcat passwd
读取文件。/etc/passwd
该awk
命令从每一行中获取第 7 个以冒号分隔的字段,这是该帐户的登录 shell。
sort | uniq -c
打印每个 shell 的出现次数。| sort -rn
如果您希望列表按受欢迎程度降序排列,请添加。
请注意,这列出了系统上所有帐户的登录 shell,其中许多实际上并不对应于用户。有多种过滤列表的方法(通常是数字用户 id,第三个字段,从 1000 开始),但没有一种方法是 100% 可靠的。
它通常就在里面/etc/passwd
(但正如上面的答案所说,由 给出getent passwd
);在某些系统上,它可以通过 NIS/YP、LDAP、...等...数据库(但另请参阅pam)。详细信息可在/etc/nsswitch.conf
(参见nsswitch.conf(5)手册页)中进行配置。
此外,授权的登录 shell 列在/etc/shells
(参见shells(5))中;您需要在此处添加一个 shell 的路径名以使其可更改chsh
(参见chsh(1))。
以 root 身份运行它!这将为您提供用户名和他们的登录 shell。
grep -v "nologin" /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$7}'
你可以找出 /etc/passwd,awk 出 shell 字段,grep -v 出任何你不想要的东西,然后对它进行排序。像这样:
cat /etc/passwd | awk -F ":" '{print $7}' | grep -v "whatever" | sort | uniq -c
在我的 Mac(没有任何“真实”用户)上,这会导致
10 个不带 shell,1 个带 /bin/sh,70 个带 /usr/bin/false,1 个带 /usr/sbin/uucico
大概在有实际用户的系统上会有 /bin/sh、/bin/ksh、/bin/csh 和 /bin/bash 数量。