如何删除脚本生成的数百个用户?

如何删除脚本生成的数百个用户?

我之前创建了一个 bash 脚本,该脚本使用密码生成器的输出作为用户名创建了 100 多个用户。到目前为止,我遇到的最接近的解决方案是创建一个要删除的用户列表,然后创建一个脚本来运行该列表。

我很好奇有人如何摆脱所有这些用户而不必手动列出所有不需要的用户,或者是否有快速的替代方案。

答案1

评论中发布的确实是最简单的解决方案:

使用您最喜欢的文本编辑器打开/etc/passwd/etc/shadow、,/etc/group然后删除它们。

唯一要补充的是,真的(应该不言而喻但没有)是:在编辑这些文件之前,请对其进行备份。

所以你会得到这样的东西:

sudo cp /etc/passwd /etc/passwd.bak
sudo cp /etc/shadow /etc/shadow.bak
sudo cp /etc/group /etc/group.bak
sudo -e /etc/passwd /etc/shadow /etc/group

现在,当然,如果你需要删除这些用户的主目录,这不会解决这个问题。但只需删除用户本身,这就是您需要做的全部。


如果你想要删除主目录,最简单的方法是过滤/etc/passwd备份和修改副本之间的差异:

comm -2 -3 /etc/passwd.bak /etc/passwd | cut -d: -f6,6 > /tmp/dirs-to-delete

然后(当你非常确保列表只包含您想要的文件)您循环遍历列表以删除所有这些文件。

实际上,我会首先进行进一步的健全性检查,以检查空格或其他奇怪的条件:

awk 'NF > 1 { printf "Problem with entry <%s> on line %d\n", $0, NR }' /tmp/dirs-to-delete

并确保目录都实际存在:

for d in $(cat /tmp/dirs-to-delete); do
  [ -d "$d" ] ||
    printf 'Supposed directory <%s> is not a directory\n' "$d"
done

并确保没有任何字符会被解释为通配符(打印任何带有特殊字符的行的行号):

sed -n '/[][*?]/=' /tmp/dirs-to-delete

但当我真正满意的时候,然后:

rm -rf $(cat /tmp/dirs-to-delete)

(请注意,该命令是危险如地狱如果你不知道确切地文件里有什么。如果你不小心的话,你可能会擦除你的硬盘。)

答案2

我想这取决于您用于添加用户的命令、选项以及您的系统配置。例如,如果您的系统配置为UID_MIN从 1000 开始,并且该系统上只有一个用户(您的用户,UID 1000),您可以使用类似以下内容只获取列表Bash 中的用户数:

for user in $(cut -d : -f 1 /etc/passwd)
do
    user_id=$(id -g ${user})
    if [ ${user_id} -ge 1001 -a ${user_id} -le 1100 ]
    then
        echo ${user};
    fi
done

如果在创建过程中使用了这些选项,您可能还想删除已创建的组和主文件夹。

答案3

我不知道如何可能有一个好的方法来做到这一点,除非您跟踪您添加的用户(例如可能在日志文件中,因为您生成了随机用户名)或者您有一些可以使用的模式区分要删除的用户和要保留的用户(例如,也许您所有的“真实”用户名仅包含字母字符,而所有随机用户名都包含非字母字符)。

我认为唯一可能节省时间的是,如果您想要保留的用户集比您想要删除的用户集小得多,或者它们在某处连续列出。如果您一次添加所有随机用户,然后没有添加任何其他用户,实际上可能会出现这种情况。在这种情况下,您也许可以获得用户列表,如下所示:

cat /etc/passwd | tail -n 100 | cut -d: -f1

然后你也可以删除它们(注意:在运行之前仔细检查所有内容!):

for username in $(cat /etc/passwd | tail -n 100 | cut -d: -f1); do
    sudo userdel "${username}"
done

答案4

使用下面的行删除用户,方法是检查不应该删除用户 ID 小于的用户的条件1001

cat /etc/passwd | awk -F ":" '{print $1,$3}' | awk '$2 > 1001 {print “userdel -r”  “ “ $1}’

相关内容