Linux账号管理
Linux的账号管理包括用户与用户组,它们两者是多对多的关系,即一个用户可以属于多个用户组,且一个用户组可以包含多个用户。一个用户组中的用户具有相同的权限。 在Linux中,用户的账户信息和用户组信息都记录在指定的文件中,这些文件构成了Linux用户管理的基础。下面我们就详细介绍Linux用户管理相关的文件。
Linux的账号文件
1./etc/passwd
这个文件虽然叫passwd,但实际存放Linux所有的账户信息,其中每一行表示一个账户信息,每条账户信息由7个字段构成,每个字段用:分隔。 这个文件中除了有root账户、我们自定义的用户账户外,还有很多系统账户,如下所示:
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
下面详细介绍每个参数的含义:
1.1. 账号名称
1.2. 密码
在passwd文件中,密码以x表示,实际的密码存放在专门的密码文件/etc/shadow中。为何要这么玩呢? 早起的Unix系统就是将密码存放在passwd文件中的这个位置上。但由于很多程序都需要读这个文件获取用户信息,那么密码就很容易被获取到,虽然密码采用了MD5消息摘要后再存储在这里,但仍然有被破解的风险,因此为了安全,现在的Linux系统都将密码单独存放在/etc/shadow中。
1.3. UID
UID=User Identifier,它是用户的标识。Linux通过UID来区分一个个账户。 UID是一个0-65535范围内的数字,不同的取值有不同的含义:
- UID=0 表示该账户为系统管理员。root的UID即为0.当然,你可把其他账户的UID设为0,此时该账户就拥有与root一样的权限。
- UID=1~99 Linux自行创建的账户,权限和普通账户没啥区别,只是为了规范。
- UID=100~499 系统操作相关的账户。这些账户是由用户创建的,权限和普通账号的权限没啥区别,也只是为了规范。
- UID=500~65535 普通用户的UID。
1.4. GID
GID=Group Identifier,他是用户组的ID。它的取值范围和UID遵循一样的规范。
1.5. 账号说明信息
这个字段是账户的说明信息,并没什么卵用,只是为了看看。
1.6. 用户主目录
每个账户都有一个主目录,用户可以在各自的主目录下为所欲为。 这个字段就是设置账户的主目录的路径。
1.7. 该账户登录后的shell
当一个用户登录后,Linux会给该用户分配一个shell来和Linux内核通信,这样该用户就能操控这台计算机了。那么Linux的shell有好多种,究竟给登录用户分配哪个shell呢?这就是在这个参数中设定。 当然,如果不想让用户操控这台计算机的话,可以将这个参数设为/sbin/nologin,这样在用户登录后Linux不会给他分配shell,从而该用户无法操控这台机器。
2./etc/shadow
这个文件存放所有账号的密码,它的权限为-r——–,也就是只有root才能查看这个文件,它具体的内容如下:
root:$1$cfvc4Vwh$KuVS9yJeWOcLkEXKbTryf.:16477:0:99999:7:::
bin:*:16300:0:99999:7:::
daemon:*:16300:0:99999:7:::
adm:*:16300:0:99999:7:::
lp:*:16300:0:99999:7:::
和passwd一样,也是一行代表一个账号,参数之间用:分隔,每个参数的含义如下:
2.1 账号名称
2.2 密码
这里才是账号真正的密码存放的地方,它采用了MD5消息摘要。
2.3 最近修改密码的日期
这个字段记录了上次修改密码的时间。 这个字段表示从1970-1-1到上次修改密码的天数。 如上述root密码的修改时间为16477,也就是1970-1-1往后16477天,也就是2015年2月11日。
2.4 密码不可以被修改的天数
这个值是从上次修改时间算起,密码不可以被修改的天数。
2.5 密码需要被重新设置的天数
从第三个字段开始,经过多少天之后就需要重新设置密码。
2.6 密码更改期限前的发出警告的天数
2.7 密码过期后的宽限天数
在宽限期间内账号仍然可以登录,只不过会给出改密码的提示。
2.8 账号失效日期
这个值也是从1970-1-1往后的天数,到了那天,这个账号就无法登录。 收费服务可以使用这个功能。
2.9 保留字段
保留字段目前还没有任何作用。
3./etc/group
这个文件中记录的是GID和用户名名的对应关系。具体内容如下:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
3.1 用户组名
3.2 用户组密码
用户组密码很少使用,这个密码由用户组管理员设置。 当然和用户密码一样,用户组的密码也存储在一个独立文件中:/etc/gshadow
3.3 GID
用户组的ID
3.4 该组的用户的用户名
本组成员的用户名。多个成员间用,隔开,注意:不能有任何空格!
4./etc/gshadow
这个文件用于存储用户组的密码,这个文件主要作用是:如果root管理员非常忙,没空管每个用户组的成员,那么可以指定几个用户组管理员,专门管理每组成员的添加与删除。 本文件具体内容如下:
root:::root
bin:::root,bin,daemon
daemon:::root,bin,daemon
4.1 用户组名
4.2 密码
密码为!表示本用户组无管理员。
4.3 本用户组的管理员账号
4.4 该用户组的成员账号
账号管理
了解了这些文件的构成后,接下来我们使用目录来操作这些文件,从而实现用户账号的管理。
1. 新增用户:useradd
useradd [-参数 参数值] 用户名
参数详解:
1.1 -u
为账户指定一个UID。
1.2 -g
为账户指定一个初始化的GID。
1.3 -G
为账户指定还需要加入的用户组。
1.4 -M
1.5 -m
1.6 -c
设置账户的描述信息。
1.7 -d
设置账户的主目录。
1.8 -r
创建一个系统管理员账号。
1.9 -s
指定这个账户的shell。
1.10 -e
设置账号失效日期,格式为:YYYY-MM-DD。
1.11 -f
设置密码失效日。-1表示永不失效。
1.12 -D
查看useradd默认的参数值。 当不用任何参数创建账号时,会使用useradd默认的参数创建,我们可以使用useradd -D查看默认的参数,如下:
GROUP=100#默认的用户组GID为100
HOME=/home#默认在/home下创建用户主目录
INACTIVE=-1#密码默认用户失效
EXPIRE=#账号也用户失效
SHELL=/bin/bash#默认的shell为bash
SKEL=/etc/skel#将这个路径下的目录复制一份作为用户主目录
CREATE_MAIL_SPOOL=yes#是否用户的mailbox
2. 设置密码:passwd、chage
这两个命令其实都是对/etc/shadow文件中的内容进行修改。passwd能设置/etc/passwd文件中的一部分参数,而chage能设置另一部分参数。
2.1 passwd
passwd [-参数 参数值] 用户名
PS:不加用户名表示修改当前账户的密码。
2.1.1 -l
将账号锁住,实则将shadow文件中的密码改为!
2.1.2 -u
将账号解锁。
2.1.3 -S
列出该用户密码的详细信息。
2.1.4 -n
设置不可以修改密码的天数。
2.1.5 -x
设置必须要修改密码的天数。
2.1.6 -w
设置过期前警告的天数。
2.1.7 -i
设置密码失效日期。
2.2 chage
chage [-参数 参数值] 用户名
2.2.1 -l
列出该账号的详细密码信息。
2.2.2 -d
查看该账号的最近一次改密时间。
2.2.3 -E
设置账号失效日。
2.2.4 -I
设置密码失效日。
2.2.5 -m
设置密码不可以被修改的天数。
2.2.6 -M
设置密码有效期。
2.2.7 -W
设置密码过期警告的天数。
3. 修改账户信息:usermod
该命令用于修改/etc/passwd和/etc/shadow中的信息。
usermod [-参数 参数值] 用户名
3.1 -L
冻结该账号。其实将shadow的密码改为!
3.2 -U
解冻该账号。
3.3 其他参数请自行查阅。
4. 删除账户:userdel
userdel [-r] username
-r :将用户相关的数据均删除,包括如下数据:
/etc/passwd和/etc/shadow中的账户数据
/etc/group和/etc/gshadow中的分组信息
/home/username和/var/spool/mail/username中的个人数据
以下命令较为简单,请自行查阅!
5. 查看自己账户信息:finger
6. 设置我的个人信息:chfn
7. 修改自己账户的shell:chsh
8. 查询指定账户的UID/GID:id
9. 新增用户组:groupadd
10. 修改用户组:groupmod
- 零基础学编程040:在Windows上安装Python库的正确姿势
- c++/c 获取cpp文件行号跟文件名
- 零基础学编程042:画函数图像
- C-SATS工程副总裁教你如何用TensorFlow分类图像 part2
- C++11 Lambda表达汇总总结
- TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)
- C++虚析构函数解析
- C-SATS工程副总裁教你如何用TensorFlow分类图像 part1
- 帝国cms文章页调用当前文章URL如何操作?
- dedecms文章页调用地址(当前文章URL)如何操作?
- 饭团开通一周,3人学会了比特币操作
- Sample K算法
- C#读取“我的文档”等特殊系统路径及环境变量
- winform CheckedListBox实现全选/全不选
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 宝塔面板成功部署Django项目流程(图文)
- Python celery原理及运行流程解析
- Python Scrapy图片爬取原理及代码实例
- Python-for循环的内部机制
- 解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
- 基于python实现模拟数据结构模型
- keras的siamese(孪生网络)实现案例
- 浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
- Python数据可视化图实现过程详解
- Python matplotlib 绘制双Y轴曲线图的示例代码
- keras 读取多标签图像数据方式
- python新手学习可变和不可变对象
- COS Android SDK DEMO搭建实践
- 利用COS多版本避免文件误删除
- kube-prometheus添加target