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/