我正在尝试找到提取 Linux 用户报告以及其中哪一个是管理员的最佳方法。目标是 Debian (8,9) 和 Ubuntu (18,20)。最终报告会很长,因此我希望第一行包含主机名,以识别每个虚拟机。我还想要一份简短的报告,只有用户名,而不是所有详细信息。
我的代码在将其推送到多个主机(通过 pssh)时带来了一些不相关的信息:
#!/bin/bash
_l="/etc/login.defs"
_p="/etc/passwd"
## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)
## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)
echo ""
echo `hostname`
echo ""
echo "----------[ User Accounts ]---------------"
awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }' "$_p"
#users with UID >= 1000 (MIN) and UID <= 60000 (MAX)
#these users are allowed to login into system if shell is bash/csh/tcsh/ksh as defined in the /etc/shells file
echo "----------[ from which, Admin Accounts ]---------------"
echo `grep '^sudo:.*$' /etc/group | cut -d: -f4`
#users in sudoers group
exit 0
它带来了垃圾谢谢您的建议。
答案1
我想知道的是用户是否可以运行任何使用 sudo 命令(以及可能的命令)。像这样的事情是收集必要数据(或用作报告)的最佳方法:
for u in $(compgen -u); do echo "# $HOSTNAME - $u"; sudo -l -U $u; echo; done
对我来说,了解 shell 和/或 UID_MIN 或 MAX 似乎无关紧要。依靠 /etc/group 中的 grep 是不够的。具有虚假或非交互式 shell 的帐户仍然可以被 sudo 到,即sudo su - falseshellaccount -s /bin/bash
.具有足够 sudo 访问权限的用户可以简单地编辑 /etc/passwd 和/或 /etc/group 来绕过 id 限制,sudo 可能由 sssd、ldap 等支持。最好简单地使用 sudo 来查看用户是否可以运行一个命令,或不。
sudo -l -U $u
也可以是稍微复杂(或简洁)的报告的基础,例如:
for u in $(compgen -u); do echo -n "# $HOSTNAME - $u"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [admin]"; fi; echo; done
或者
for u in $(compgen -u); do if [ $(id -r -u $u) -gt 3 ]; then echo -n "# $HOSTNAME - $u"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [admin]"; fi; echo; fi; done
或者
for u in $(compgen -u); do uid="$(id -r -u $u)"; uid=${uid:-"0"}; echo -n "# $HOSTNAME -"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [ADMIN]"; fi; echo -n " uid $uid, $u"; echo; done
...以上任何命令都可以在单引号内运行,以便它们可以传递给 ssh (或 ansible 等),即
ssh remote-host 'for u in $(compgen -u); do uid="$(id -r -u $u)"; uid=${uid:-"0"}; echo -n "# $HOSTNAME -"; if sudo -l -U $u | grep -vq "not allowed"; then echo -n " [ADMIN]"; fi; echo -n " uid $uid, $u"; echo; done'