微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Shell脚本来获取Linux上定义的用户列表?

我把它放在一起,但它很糟糕(例如,在那里的魔法数字,文本parsing..嘘!)

awk -F: '{if($3 >= 1000 && $3 < 2**16-2) print $1}' /etc/passwd

什么是正确的方法来做到这一点?

在Linux文件中只打印6个和10个字符

使用awk,grep,sedparsing大型日志文件(〜5gb)时的性能问题

如何使用awk忽略空白行和注释行

我怎样才能比较和打印来自不同文本文件的数据到一个在壳牌。

如何计算一个string出现在只有AWK的文本文件中的次数

一些unix系统不使用/etc/passwd ,或者没有在那里指定的用户。 您应该使用getent passwd而不是读取/etc/passwd 。

我的系统也有用户被禁用,并可以更长的登录,他们的登录命令设置为/bin/false或/usr/sbin/nologin 。 你可能也想把它们排除在外。

这里是适用于我的,包括arheops awk命令和ansgar的代码,以从login.defs获取min和max:

getent passwd | grep -vE '(nologin|false)$' | awk -F: -v min=`awk '/^UID_MIN/ {print $2}' /etc/login.defs` -v max=`awk '/^UID_MAX/ {print $2}' /etc/login.defs` '{if(($3 >= min)&&($3 <= max)) print $1}' | sort -u

我不确定你为什么只做1000以上,从redhat系统启动500。

对于我这个awk脚本工作正常:

awk -F: '{if(($3 >= 500)&&($3 <65534)) print $1}' /etc/passwd

仅使用密码

awk -F: '{if(!(( $2 == "!!")||($2 == "*"))) print $1}' /etc/shadow

从/etc/login.defs提取最小和最大用户ID,然后从/etc/passwd选择这些边距之间的ID的用户

UID_MIN=$(awk '/^UID_MIN/ {print $2}' /etc/login.defs) UID_MAX=$(awk '/^UID_MAX/ {print $2}' /etc/login.defs) awk -F: -v min=$UID_MIN -v max=$UID_MAX '$3 >= min && $3 <= max{print $1}' /etc/passwd

这是另外一种只生成一个外部程序的方法, getent (由@AnsgarWiechers建议),以便使用本地和网络密码数据库。 这个将叉子的数量减少到只有一个叉子本身。 但是,它的可移植性受限于某些bash4。

get_users () { local IFS=$' t#' while read var val ; do case "$var" in UID_MIN) min="$val" ;; UID_MAX) max="$val" ;; esac done < /etc/login.defs declare -A users local IFS=: while read user pass uid gid gecos home shell; do if (( min <= uid && uid <= max )) && [[ ! $shell =~ '/(nologin|false)$' ]]; then users[$user]=1 fi done < <(getent passwd 2>/dev/null) echo ${!users[@]} }

所以你只是想从/ etc / passwd获取所有用户的列表? 如果是这样,我相信这将是一个更简单的解决方案:

cut -d":" -f1 /etc/passwd

编辑:

如果你只想要一个用户定义的用户(而不是系统用户)的列表,你可以使用其中的一个

grep -E ":[0-9]{4,6}:[0-9]{4,6}:" /etc/passwd | cut -d: -f1

^这假定您的系统为用户定义的用户使用1000以上的UID和GID

grep /home /etc/passwd | cut -d: -f1

^这假定每个用户定义的用户都有一个主目录。

其他解决方案取决于更详细的标准和您的系统设置。

这是@ StephenOstermiller的答案的简化,只有两个过程才能完成。 我觉得也比较容易阅读(假如你熟悉awk NR==FNR习惯用法)。

getent passwd | awk 'NR==FNR { if ($1 ~ /^UID_(MIN|MAX)$/) m[$1] = $2; next } { split ($0,a,/:/); if (a[3] >= m["UID_MIN"] && a[3] <= m["UID_MAX"] && a[7] !~ /(false|nologin)$/) print a[1] }' /etc/login.defs -

两个输入的不同分割模式有点疣, 也许你可以修改更优雅的方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐