在Linux系统中管理用户组很容易,但相关的命令可能比您知道的更灵活。用户组在Linux系统中扮演着重要的角色。用户组为一组用户提供了一种相互共享文件的简便方法。用户组还允许系统管理员更有效地管理用户权限,因为管理员可以将权限分配给用户组,而不是单独分配给单个用户。虽然用户组通常是在将用户帐户添加到系统时创建的,但是关于用户组如何工作以及如何使用它们还有很多东西需要学习。一个用户和一个用户组?Linux系统中的大多数用户帐户都被设置为具有相同的用户名和用户组名。用户jdoe被分配了一个名为jdoe的用户组,并成为新创建的用户组的唯一成员。如本例所示,在创建新帐户时将用户的登录名、用户ID和用户组ID添加到/etc/passwd和/etc/group文件中:$sudouseraddjdoe$grepjdoe/etc/passwdjdoe:x:1066:1066:JaneDoe:/home/jdoe:/bin/sh$grepjdoe/etc/groupjdoe:x:1066:这些文件中的配置使系统能够在两种形式的用户id-jdoe之间进行转换是1006,1006就是jdoe。分配给每个用户的UID(用户id)和GID(组id)通常是相同的,顺序递增。如果JaneDoe是上例中最近添加的用户,则分配给下一个新用户的用户ID和组ID很可能都是1067。GID=UID?UID和GID可能不匹配。例如,如果您使用groupadd命令添加一个组而没有指定组ID,系统将分配下一个可用的组ID(本例中为1067)。下一个添加到系统的用户将具有UID1067和GID1068。您可以通过在添加组时指定较小的组ID而不是接受默认值来避免此问题。在下面的命令中,我们添加了一个用户组,并提供了一个小于用于用户帐户的GID值范围的GID。$sudogroupadd-g500devops创建帐户时,如果更适合您,您可以指定一个共享用户组。例如,您可能希望将新开发人员添加到同一个DevOps用户组,而不是每个人一个用户组。$sudouseradd-gstaffbennyg$grepbennyg/etc/passwdbennyg:x:1064:50::/home/bennyg:/bin/sh一级用户组和二级用户组用户组其实分为两类:一级用户组一级组和二级用户组二级组。主用户组是存储在/etc/passwd文件中的用户组,它是在创建帐户时配置的。当用户创建文件时,该用户的主要用户组与该文件相关联。$whoamijdoe$grepjdoe/etc/passwdjdoe:x:1066:1066:JohnDoe:/home/jdoe:/bin/bash^|+--------主要用户组$touchnewfile$ls-lnewfile-rw-rw-r--1jdoejdoe0Jul1615:22newfile^|+------主要组用户拥有帐户后加入的那些组是次要组。次要用户组成员身份显示在/etc/group文件中。$grepdevops/etc/groupdevops:x:500:shs,jadep^|+--------shs和jadep的二级用户组/etc/group文件为用户组分配组名(例如500=devops)并记录二级用户组成员。首选规则是每个用户都是他自己的主要用户组的成员,并且可以是任意数量的次要用户组的成员。此规则允许用户更轻松地将个人文件与需要与同事共享的文件分开。当用户创建文件时,用户所属的不同用户组的成员不一定具有访问权限。用户必须使用chgrp命令将文件与二级用户组相关联。添加新帐户时的一个重要细节是useradd命令不一定为新用户添加主目录/home。如果您只是有时想为用户添加主目录,您可以将-m选项添加到useradd命令(将其视为“home”选项)。$sudouseradd-m-gdevops-c"JohnDoe"jdoe2该命令中的选项如下:-m创建主目录并在其中生成初始文件-g指定用户所属的用户组-c添加帐户描述信息(通常是用户名)如果您想始终创建一个主目录,您可以编辑/etc/login.defs文件来更改默认行为。更改或添加CREATE_HOME变量并将其设置为yes:$grepCREATE_HOME/etc/login.defsCREATE_HOMEyes另一种方法是使用您自己的帐户设置别名,以便useradd始终具有-m选项。$aliasuseradd='useradd-m'确保将别名添加到您的~/.bashrc文件或类似的启动文件以使其永久化。深入/etc/login.defs下面的命令列出了/etc/login.defs文件中的所有设置。下面的grep命令隐藏所有注释和空行。$cat/etc/login.defs|grep-v"^#"|grep-v"^$"MAIL_DIR/var/mailFAILLOG_ENAByesLOG_UNKFAIL_ENABnoLOG_OK_LOGINSnoSYSLOG_SU_ENAByesSYSLOG_SG_ENAByesFTMP_FILE/var/log/btmpSU_NAMEsuHUSHLOGIN_FILE.hushloginENV_SUPATHPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binENV_PATHPATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/gamesTTYGROUPttyTTYPERM0600ERASECHAR0177KILLCHAR025UMASK022PASS_MAX_DAYS99999PASS_MIN_DAYS0PASS_WARN_AGE7UID_MIN1000UID_MAX60000GID_MIN1000GID_MAX60000LOGIN_RETRIES5LOGIN_TIMEOUT??60CHFN_RESTRICTrwhDEFAULT_HOMEyesCREATE_HOMEyes<===USERGROUPS_ENAByesENCRYPT_METHODSHA512注意此文件中的各种设置会决定用户id的取值范围以及密码使用期限和其他设置(suchasumask).如何显示用户属于哪些用户组一个用户可能由于各种原因属于多个用户组。组成员身份使用户能够访问用户组所拥有的文件和目录,有时这一点很重要。要生成用户所属的用户组列表,请使用groups命令。$groupsjdoejdoe:jdoeadminadmincdromsudodipplugdevlpadminstaffsambashare您可以键入不带任何参数的groups命令来列出您自己的用户组。如何将用户添加到用户组如果要将现有用户添加到另一个用户组,可以执行以下命令:$sudousermod-a-Gdevopsjdoe您还可以指定以逗号分隔的用户组列表将用户添加到多个用户组:$sudousermod-a-Gdevops,mgrsjdoe参数-a表示“添加”,-G指定用户组列表。您可以通过编辑/etc/group文件从组成员列表中删除用户名,从而从用户组中删除用户。usermod命令也可以有一个选项来从用户组中删除一个成员。fish:x:16:nemo,dory,鲨鱼|Vfish:x:16:nemo,doryFeed添加和管理用户组并不是特别困难,但是从长远来看,配置帐户的一致性可以使工作更轻松。
