使用Python在Linux中创建用户组
我想在CentOS系统上用Python创建一个用户组。这里说的“用Python”是指我不想用os.system直接输入Unix命令来创建新组。我想知道有没有什么Python模块可以处理这个问题。
在网上搜索了一下,没找到太多关于我想要的内容,除了Python用户组的信息,所以我只好来问这个问题。
我在这里(StackOverflow)了解到有一个叫grp的模块,但没找到关于如何创建用户组的相关信息。
补充说明:我不知道是否需要重新提问,但我也想知道如何把(已经存在的)用户添加到新创建的用户组里。
任何帮助都非常感谢。谢谢。
4 个回答
创建一个组并没有专门的库调用。这是因为实际上并不存在“创建组”这个概念。GID(组标识符)只是分配给一个进程或文件的一个数字。这些数字都是已经存在的,你不需要做任何事情就可以开始使用GID。如果你有足够的权限,可以使用chown(2)命令将文件的GID设置为任何数字,或者使用setgid(2)命令来设置当前进程的GID(这里面还有一些细节,比如有效ID、补充ID等等)。
给GID起名字是通过在基本的Unix/Linux/POSIX系统中的/etc/group文件来完成的,但这其实只是Unix/Linux/POSIX用户工具遵循的一种约定。还有其他基于网络的目录,如Jack Lloyd提到的那样。
man手册中的group(5)描述了/etc/group文件的格式,但不建议你直接去修改这个文件。你的操作系统会有一些政策来管理未命名的GID,比如为不同的用途保留某些空间(固定系统组、动态系统组、用户组等等)。这些数字范围在不同的操作系统中是不同的。这些政策通常会在系统管理员用来分配未命名GID的命令行工具中体现出来。
所以,添加一个本地组的最佳方式就是使用命令行工具。
我觉得你应该从你的程序中使用命令行工具,因为这些工具在设计时考虑了很多细节,确保如果出现问题,它们不会破坏用户组文件。
不过,如果你想自己动手写的话,这个文件格式其实挺简单的。
我不知道有没有专门的Python模块可以做到这一点,但/etc/group和/etc/gshadow这两个文件的格式是比较标准的。如果你想的话,可以直接打开这些文件,看看里面的内容,然后在必要的时候添加新的用户组。
不过在你动手之前,先考虑一下:
- 如果你试图添加一个已经存在的用户组,会发生什么?
- 如果你的程序有多个实例同时尝试添加用户组,会发生什么?
- 如果在未来的版本中,用户组的格式发生了不兼容的变化,你的代码会受到什么影响?
- NIS、LDAP、Kerberos等等,这些你也要考虑。
如果你不想处理这些问题,直接使用subprocess模块来运行groupadd命令就好。这种方式出错的可能性会小很多,不会轻易影响到用户的机器。
还有一种方法是把groupadd.c(在shadow包里)的代码用Python封装起来,这样做会比自己写的代码更稳妥。不过我觉得这样做并没有太大好处,反而会让你的代码变得更复杂,也更容易出问题。