文章目录
- 1.Linux的账号和用户组
- 1.1 用户标识符:UID与GID
- 1.2 用户账号
- 1.2.1 登录系统流程
- 1.2.2 /etc/passwd文件结构
- 1.3 初始与有效用户组
- 1.3.1 /etc/group文件结构
- 1.3.2 初始与有效用户组
- 2.账号管理
- 2.1 用户增加、删除、修改
- 2.1.1 useradd
- 2.1.2 passwd
- 2.1.3 usermod
- 2.1.4 userdel
- 2.2 用户功能
- 2.3 用户组添加、删除
- 3.用户身份切换
- 3.1 su
- 3.2 sudo
- 4.特殊的shell---/sbin/nologin
1.Linux的账号和用户组
之前的文章说到了,Linux是一个多用户、多任务的操作系统,为了防止不同用户之间文件的安全问题,Linux系统加入了文件权限管理的功能,那对于这么多用户来说,Linux系统中账号管理也就变得相当重要了。
1.1 用户标识符:UID与GID
在说明如何对账号进行添加、修改之前,我们先来说明一下,Linux系统是如何从众多的账号之中,辨别出你的那个账号。
当我们登录系统时,输入用户名,而对于主机来说,是不会识别用户名的,计算机对数字比较敏感一些,它会拿着用户名去/etc/passwd
中查看你的ID,从而判断出你到底是不是你?
每个登录的用户至少都会取得两个ID,一个是用户ID(UID),一个是用户组ID(GID),我们在前面学到文件都具有文件所有者
和用户组
的属性,其实就是因为,每一个文件都具有UID
和GID
两个ID,当我们要查看文件的属性的时候,系统就会拿着这两个ID去查看/etc/passwd
和/etc/group
,找到ID对应的名称然后显示出来。
以上就是用户的标识符UID
和 GID
的概念
1.2 用户账号
1.2.1 登录系统流程
既然已经了解用户的UID
和GID
的概念,下面就说明一下,当我们登录shell时,系统都做了什么事情
- 我们向bash中输入账号和密码
- 系统拿着账号去查阅
/etc/passwd
,当账号不存在文件中,则跳出;若存在,则将账号的UID
和GID
读出,同时获取的还有账号的主文件夹和shell设置。 - 接下来,系统会进入
/etc/shadow
找到对应的账号和UID,然后核对前面输入的密码和保存的密码是否一致 - 如果密码核对成功,则获取shell,进入系统。
从上面的流程我们知道,跟用户账号有关的两个重要文件
- /etc/passwd:管理用户UID/GID等参数
- /etc/shadow:专门管理密码相关数据
1.2.2 /etc/passwd文件结构
文件中,每一行代表一个账号的相关信息,而每一行的各个字段使用
:
作为分隔符;同时需要注意的是,文件里面的很多账号本来就是系统正常运行所必须要的,可以叫它系统账号(例如bin、darmon等),这些账号请不要删除噢!
为了记录清楚/etc/shadow
文件的结构,我列出了我系统中hadoop
这个用户在文件中存储的示范。
[root@wing ~]# grep hadoop /etc/passwd
hadoop : x : 1000 : 0 : : /home/hadoop : /bin/bash
#[1] [2] [3] [4][5] [6] [7]
- [1]:账号名称
- [2]:密码;这一个字段需要特别的说明一下,早期的密码就放在这个字段上面,然而这个文件的特性是所有文件都能够读取,为了账号密码的安全性,后期将账号的密码放到
/etc/shadow
中去,此处就用x
代替了。 - [3]:UID
- [4]:GID
- [5]:用户信息说明列
- [6]:主文件夹;当你登录之后,就会进入用户对应的主文件夹中去
- [7]:Shell;当用户登录系统后就会取得一个Shell来与系统的内核通信以进行用户的操作任务。而登录之后的默认Shell就是由这一个字段决定的。有一个Shell可以用来替代成让账号无法取得Shell环境的登录操作,这就是特殊的 /sbin/nologin,这个我们最后再来简单介绍。
1.3 初始与有效用户组
1.3.1 /etc/group文件结构
在前面介绍了GID
这一个属性,然而还没有具体的介绍用户组的配置文件,现在就来说说这一个文件—/etc/group
/etc/group
在这个文件中,一行代表一个用户组,同时各行使用:
作为各个字段的分隔符(共分为4个字段)。
[root@wing ~]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
- [1]:用户组名称
- [2]:用户组密码
- [3]:GID
- [4]:此用户组支持的账号名称
这里提出一个问题:一个账号可以属于多个用户组,那么当执行命令的时候,应该以哪一个用户组为准呢?(如创建文件)这就需要提出初始用户组和有效用户组的概念了。
1.3.2 初始与有效用户组
- 每个用户都有一个
GID
的属性,这就是用户的初始用户组,当用户登录以后,就自动拥有这个用户组的相关权限,因此,这个用户也就不用再/etc/group
的第四列中写入。 - 而非初始用户组就需要在
/etc/group
中对应的用户组行中,将用户名写入第四列中,这样才能给该用户加入指定用户组的支持。
有一个账号Test
,同时属于用户组A
和用户组B
,当你新建一个文件,这个文件属于哪一个用户组,这就取决于用户此时的有效用户组是哪一个了!
- group:有效与支持用户组的查看:第一个输出的用户组就是有效用户组。
- newgrp:有效用户组的切换:切换的用户组必须是你已经有支持的用户组,它切换用户组的同时,是使用另外一个shell来登录,这一点需要注意!
2.账号管理
2.1 用户增加、删除、修改
2.1.1 useradd
在Linux系统添加一个用户
[root@wing ~]# useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] 用户名
# -u :给该用户指定UID
# -g :指定用户组名(即初始用户组)
# -G :后接组名,表示该用户还可以被该用户组支持
# -M :不创建用户主文件夹(系统账号默认值)
# -m :创建用户主文件夹(一般账号默认值)
# -c :/etc/passwd第五列的说明内容
# -d :指定某个目录为主文件夹
# -r :表明创建一个系统账号
# -s :shell设置信息,默认为/bin/bash
[root@wing ~]# useradd test #完全参考默认值创建一个用户
- 当我们什么参数都不加时创建一个用户,此时会默认创建一个用户主文件夹,权限为700
- 同时会创建一个与账号一模一样的用户组名
- 由于系统账号主要是用来进行运行系统所需服务的权限设置,所以系统账号默认都不会主动创建主文件夹的。
2.1.2 passwd
[root@wing ~]# passwd [-l] [-u] [--stdin] [-S] 用户名
# --stdin :可以通过来自前一个管道的数据,作为密码输入!
# -l :表示Lock,会将/etc/shadow第二列前加上“!”,使密码失效
# -u :表示Unlock
# -S :列出密码相关参数
[root@wing ~]# passwd test #修改用户密码
- 这里需要特别说明
--stdin
这个参数,下面这个操作可以直接更新用户的密码而不用再次手动输入! - 第三个个命令可以让用户第一次登陆时,强制用户更改他们账号的密码之后才可以使用系统的资源!
[root@wing ~]# useradd test #添加一个test用户
[root@wing ~]# echo "abc123" | passwd --stdin test #将test用户的密码设置为“abc123”
[root@wing ~]# chage -d 0 test #这一个命令可以让用户第一次登陆时,强制用户更改他们账号的密码之后才可以使用系统的资源!
2.1.3 usermod
我们在创建用户的时候,可能会设置错用户的参数,所以就会需要使用usermod
这个命令来修改
[root@wing ~]# usermod [-cdegGlsuLU] 用户名
# -c :/etc/passwd第五列的说明内容
# -d :指定某个目录为主文件夹
# -g :指定用户组名(即初始用户组)
# -G :后接次要用户组,表示该用户还可以被该用户组支持
# -a :与 -G 合用可增加次要用户组的支持而非设置
# -l :后面接账户名称,修改用户名称
# -s :shell设置信息,默认为/bin/bash
# -L :暂时将用户的密码冻结,使其不能登录
# -U :将 /etc/shadow 密码列 !去掉
2.1.4 userdel
删除指定的用户
[root@wing ~]# userdel [-r] username
#-r : 连同用户的主文件夹一起删除
2.2 用户功能
- id:用来查看用户或自己相关的UID、GID信息
[hadoop@wing ~]$ id
uid=1000(hadoop) gid=0(root) groups=0(root)
2.3 用户组添加、删除
- groupadd: 添加用户组
- groupmod:修改用户组信息(-n:后接组名,修改用户组名字)
- groupdel:删除用户组
3.用户身份切换
3.1 su
1.为了防止用户平时使用系统时发生误操作,所以平时系统操作时,最好使用一般账号
2.为了系统安全,有些时候我们需要使用系统账号来启动一些系统服务(如http服务),防止该服务被攻破时,系统不至于损坏。
- su:进行身份的切换
- 单纯使用su切换root身份,读取的变量设置方式为non-login shell的方式,这种方式下很多原本的变量不会被改变。
[root@wing ~]# su [-] [用户名]
# - :单纯使用“-”,如“su -”代表使用login-shell的变量文件读取方式来登录系统,若用户名称没有加上去,则代表切换为root用户
3.2 sudo
使用su命令切换成用户时,需要输如该用户对应的密码,而使用sudo命令时,只需要使用自己的密码就可以切换了。这与
/etc/sudoers
文件相关
- 使用户加入sudo权限
-
visudo
:/etc/sudoers
这个文件是有特定的格式的,所以需要使用这个命令来进行更改
root All=(All) All
hadoop All=(All) All #这是新增的支持sudo命令的用户
%test All=(All) All #这是新增的支持sudo命令的用户组(%表示用户组)
4.特殊的shell—/sbin/nologin
我们前面说到对系统的各种操作,都是基于用户登录进系统之后的,而有一些服务我们并不希望它能登录系统(如ftp服务),尤其是系统账号,它们使用的shell就是/sbin/nologin
。
这里的无法登录指的仅是这个用户无法使用bash或者其他的shell来登录系统而已,并不是说这个账号就无法使用其他的系统资源。