Linux下用户和组管理
2014-07-27
背景
平日里,常遇到几个需求:
- Linux服务器上,为新人开个账号,并加入到某一组中;
- 查询,组中的所有用户;
- 查询,用户是否存在;
- 查询,某一用户所在组;
- 用户和组管理,如何实现的;
如何使用
几个命令
用户相关:
useradd [LOGIN]:新增用户passwd [LOGIN]:设置用户密码usermod [options] [LOGIN]:修改用户的属性信息,与useradd类似userdel [LOGIN]:删除用户whoami:当前登录的用户
用户组相关:
groups [LOGIN]:查询用户所属组groupadd [GROUP]:新增用户组gpasswd [GROUP]:设置组成员、添加组管理员(参考命令:usermod)groupmod [GROUP]:修改用户组信息,与groupadd类似groupdel [GROUP]:删除组newgrp [GROUP]:设置有效组
注:作为初始组的用户组,无法使用命令groupdel进行删除。
上面的命令,细节不想多说,用的时候,直接man command查看帮助文档即可。
几个文件
| 文件 | 说明 |
|---|---|
/etc/passwd |
用户信息 |
/etc/shadow |
用户密码信息 |
/etc/group |
用户组信息 |
/etc/gshadow |
用户组管理信息 |
/etc/passwd####
文件片段:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
hbase:x:1002:507::/home/hbase:/bin/bash
nagios:x:1003:508::/home/nagios:/bin/bash
oozie:x:1004:507::/home/oozie:/bin/bash
hcat:x:1005:507::/home/hcat:/bin/bash
hive:x:1006:507::/home/hive:/bin/bash
yarn:x:1007:507::/home/yarn:/bin/bash
hdfs:x:1008:507::/home/hdfs:/bin/bash
mapred:x:1009:507::/home/mapred:/bin/bash
格式说明:
`用户名`:`密码`:`UID`:`GID`:`用户说明信息`:`默认登录路径`:`Shell`
补充说明:
密码列,是历史遗留问题,现在所有的密码,都已被单独的提出并存储至/etc/passwd文件中;UID=0,表示系统管理员;GID,与文件/etc/group有关,这个文件用于规范组名和GID的对应关系;Shell,用户登录之后,就会获得一个Shell进程来与系统核心进行沟通,以此来执行用户任务;特别需要注意的是,/sbin/nologin将会使用户无法登录;
/etc/shadow####
文件片段:
root:$6$t...(实际密码较长):15996:0:99999:7:::
bin:*:15422:0:99999:7:::
sshd:!!:15977::::::
dev:!!:15989:0:99999:7:::
devp:$6$...(实际密码较长):15989:0:99999:7:::
mysql:!!:15990::::::
storm:$6$2...(实际密码较长):15991:0:99999:7:::
strom:!!:15991:0:99999:7:::
ambari-qa:!!:16262:0:99999:7:::
hbase:!!:16262:0:99999:7:::
nagios:!!:16262:0:99999:7:::
oozie:!!:16262:0:99999:7:::
hcat:!!:16262:0:99999:7:::
hive:!!:16262:0:99999:7:::
yarn:!!:16262:0:99999:7:::
hdfs:!!:16262:0:99999:7:::
mapred:!!:16262:0:99999:7:::
格式说明(:分隔各个列):
用户名密码:是加密后的结果,但仍有可能被破解;最近改动密码日期:单位:天,从1970.01.01算起的天数;密码不可被改动的天数:多少天内不能修改;如果为0,表示随时可以更改;密码需要重新改动的天数:多少天内需要修改再次密码;需要变更前的警告天数:在密码需要重新改动的天数到来之前,提前显示警告信息;密码过期后帐号宽限期:在密码需要重新改动的天数到来之前,都没有修改密码,那么还有机会,在宽限期内,用户登录,系统会强制用户必须重新设定密码;帐号失效日期:单位:天,从1970.01.01算起的天数;过了这一天,帐号当即失效;- (保留)
补充说明:
密码列,是加密后的结果,但仍有可能被破解;最近改动密码日期列,单位:天,从1970.01.01算起的天数;密码不可被改动的天数列,从最近改动密码日期向后推迟的天数,如果为0,表示随时可以更改;密码需要重新改动的天数列,强制用户在多少天内必须修改密码;chage -l [LOGIN]命令,可用于查询用户密码相关的详细信息;
小提示:
有趣的功能:用户第一次登录后,强制其修改密码后才能使用系统资源. 具体命令:
chage -d 0 [LOGIN]
/etc/group####
文件片段:
hadoop:x:507:hbase,hdfs,mapred
nagios:x:508:
mailnull:x:47:
smmsp:x:51:
hdfs:x:481:devp
hbase:x:480:
格式说明:
`组名`:`群组密码`:`GID`:`组内成员`
补充说明:
- 在上面文件片段中,如果想将用户nagios,添加到hdfs组中,则,只需在hdfs的
组内成员列中添加,nagios即可; id命令,可查询用户组的详细信息;(类似groups命令)
疑问:
有的账户,在
/etc/passwd中,看出其GID项为507,而在/etc/group中GID=507的组内成员中,并没有看到这些账户?
这个涉及到有效组(effective group)和初始组(initial group)的概念,请往下继续看。
有效组(effective group) vs. 初始组(initial group)
- 文件
/etc/passwd中,每个用户对应有且只有一个GID,这是初始组,即用户一登入系统,立即拥有这个群组的权限; 初始组,不需要在/etc/group文件的组内成员中写入该用户(也可以写入);- 若用户还属于
非初始组,则,在/etc/group文件的组内成员部分进行标识; - 用户新建一个文件,这个文件属于
有效组; groups命令,查询出的组中,第一个组为有效组;- 用户登录之后,
newgrp [GROUP]命令,可以切换有效组;
额外,需要说明一下newgrp [GROUP],其实质上是有启动了一个shell,来实现切换有效组的,具体如下:
如何将用户添加到组中呢?两种方式:
- root用户,使用命令:
usermod; - 组管理员,使用命令:
gpasswd;(下文会介绍)
有个问题,记录一下:
疑问:命令
newgrp会重新启动一个shell,shell是kernel之外的一层壳,shell与进程、线程之间什么关系?shell是如何调用内核?
(之前APUE课程上,有个课下作业:写一个自己的shell,类似bash)
/etc/gshadow####
文件片段:
hadoop:!::hbase,hdfs,mapred
nagios:!::
mailnull:!::
smmsp:!::
hdfs:!::
格式说明:
`组名`:`组密码`:`组管理员帐号`:`组内成员`
补充说明:
组密码为!,表示无合法密码,无组管理员;组内成员,与/etc/group文件中内容相同;
具体添加组内成员、设置组的管理员,使用命令:gpasswd。
特别提示####
使用useradd、passwd等命令添加用户,并为用户设置用户组之后,如果想修改用户的信息,两条途径:
- 直接修改
/etc/passwd和/etc/shadow文件中相应字段; - 使用
usermod命令进行修改;[推荐]
深入原理
为什么存在用户和用户组
主机放在这,谁都想用,如果所有人(UserA\UserB\UserC)都使用同一个帐号登录,则,大家都没有隐私可言,而且UserA的文件可能会被UserB给删除;这就要求创建多个帐号(用户),UserA\UserB\UserC每人使用一个不同的帐号来登陆,这样大家的文件就相互隔离了;问题又来了,UserA想与UserB共享文件FileA,但是不想与UserC共享这一文件怎么办?这就产生了用户组这一概念,只需要UserA\UserB同属某个用户组GroupA,然后设置组GroupA内的人都有权操作FileA就可以了。
具体实现原理
用户登录时,输入用户名和密码,实际上,Linux主机是按照 UID(User ID) 来识别用户的,用户名是为便于人们记忆才存在的。
同理,Linux主机只识别GID(Group ID)来标识用户组。具体,使用ls -l命令查询文件详情时,系统会按照GID和UID分别去文件/etc/group和/etc/passwd中查询相应的用户组和用户的名字并显示出来。
上面一段话,总结:系统上文件属性、权限等存储的都是UID和GID,只有在登录、显示时,才会用到用户名和用户组名。
参考来源
- 《鸟哥私房菜基础篇(第三版)》 第6章 Linux的档案权限与目录配置
- 《鸟哥私房菜基础篇(第三版)》 第14章 Linux帐号管理与ACL权限设定
原文地址:https://ningg.top/linux-user-and-group/