如何检查哪个包创建了用户?

如何检查哪个包创建了用户?

怀疑某些软件包在安装时运行了脚本,这些脚本会在 中创建用户帐户/etc/passwd。我如何检查哪个软件包创建了特定用户?

答案1

如果软件包是通过dpkg(包括使用apt install) 安装的,这将相当可靠地工作。请参阅muru 的回答获取在默认 Ubuntu 安装中创建的用户列表以及创建这些用户的软件包。对于这些用户,此方法不会产生任何输出。

您可以使用以下命令:

grep -RlE '(adduser|useradd).*systemd' /var/lib/dpkg/info --include='*inst' | sed -r 's:.*/(.*)\.[-a-z]+inst:\1:'

替换<user>为您感兴趣的用户的名称,例如,systemd

这将搜索已知或命令和相关用户的所有软件包的preinst和脚本,以查看哪个软件包负责创建该用户。结果通过管道传输到 sed,因此它只返回软件包名称本身,而不是脚本文件的完整名称。postinstdpkgadduseruseradd

解释

  • grep -RlE递归搜索并仅打印包含匹配项的文件的名称,使用扩展正则表达式
  • '(adduser|useradd).*<user>' /var/lib/dpkg/info --include='*inst'在存储脚本的目录中,在名称以 结尾的文件中,在同一行中搜索adduseruseradd命令和要查找的用户(将匹配它们之间的任何字符,捕获任何命令选项).*dpkginst
  • sed -r 's:.*/(.*)\.[-a-z]+inst:\1:'删除/完整路径和扩展.preinst名之前的所有内容(包括最后一个).postinst

感谢@muru 建议一种比find这里更简洁、更快捷的搜索方式:)

答案2

这里有一个重要的例外,即通常adduser添加的用户和组:Ubuntu 默认自带的用户和组。这些是由软件包提供的base-passwd。此软件包添加的用户和组的列表在 中给出(并描述)/usr/share/doc/base-passwd/users-and-groups.{html,txt.gz}。列表如下:

用户(通常有相应的组)

root    man     majordom    irc         gdm
daemon  lp      postgres    gnats       saned
bin     mail    www-data    nobody      klog
sys     news    backup      messagebus  syslog
sync    uucp    operator    postfix
games   proxy   list        haldaemon

群组(无对应用户)

adm     fax     audio       staff       sshd
tty     voice   src         users       fetchmail
disk    cdrom   shadow      lpadmin     cupsys
kmem    floppy  utmp        sasl        nogroup
dialout tape    video       scanner
dip     sudo    plugdev     ssh

软件包 README(/usr/share/doc/base-passwd/README)还列出了一些 UID 在 60000 到 64999 范围内的用户,并指出这些用户是由相应的软件包创建的。

另请参阅:

相关内容