Linux是一个多用户多任务的操作系统,多用户指多个用户可以同时使用该操作系统完成相应的操作,多任务是指Linux可以同时执行几个任务,可以在还未执行完一个任务时又执行另一项任务,通过并行和并发来实现。
多用户就要面临着用户管理的问题,主要有用户密码、权限、组的管理,实际通过以下文件来进行控制,一些辅助命令也是对以下几个文件进行操作。
/etc/passwd
存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。
# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
......
采用冒号进行分割,分别是用户名、密码、用户id、组id、备注、家目录、默认shell,以下进行较为详细的解释说明:
用户名
用户名就不解释了,简单的来说就是Linux用户的一个绰号
密码
密码位置一般是X,只是一种标致,真正的密码保存在/etc/shadow
文件中,但是如果该位置为空,系统会认为该用户不需要密码即可登录
用户ID
一般称为UID
,Linux系统是通过UID
来识别不同的用户和分配用户权限的,0表示超级用户,把普通用户的UID
修改为0即可变为一个超级管理员,但实际是不允许这么操作
组id
一般称之为GID
,一个用户可以属于多个组,这里显示的是用户的初始化时候的组,也就是第一个组,一般就是将和这个用户的用户名相同的组名作为这个用户的初始组。另外就是附加组的概念了,也就是后来陆陆续续加入的其他组,可以在/etc/group
文件中查看。
另外初始组后续也是可以修改的。
备注
一般默认就是用户名,也可以设置成其他的信息,就是一个简要的说明,实际生产中也很少用到。
家目录
用户登录计算机后,首先进入的那个目录就是家目录,后续再任意位置执行cd ~
即可到达家目录。
默认shell
shell是一个命令行解释器,简单的来说就是人与机器命令交互的窗口,相当于win下的视窗,常见的shell解释器有sh、bash这两种,其他的有ksh、csh等不是特别常见,现在的主流Linux默认shell是bash,一般个人使用尤其是在mac上会安装一下zsh
,主要是因为oh-my-zsh
这个傻瓜是的配置工具,提供了命令不全、美化、各种神插件提升工作效率。
/etc/shadow
由于设计上/etc/passwd
所有用户都有读权限,因此密码保存在这上面所有用户都可以看到,是不安全的,后来就将密码相关的内容同单独拉出来一个文件进行保存,并且加了其他的一些参数更加有效的保障密码的安全。
cat /etc/shadow
root:$6$FJ.dgxnl$asdffrEo4ePq427V5pJq9VCAmfsQrzZkBw2ac7FlYPdepgBURTFPV7sfmH9d7vK3xkJ0Yz0bm6ReM5mkiciQC.:17984:0:99999:7:::
daemon:*:17212:0:99999:7:::
bin:*:17212:0:99999:7:::
sys:*:17212:0:99999:7:::
同样也是采用冒号分割,分别是用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
用户名
用户名就不用解释了,与passwd文件中的用户名对应
密码
现在密码一般采用SHA512 散列加密算法,加密等级更高,也更加安全
最后修改时间这个数字指的是从1970 年 1 月 1 日作为 1 不断累加得到的天数,可以通过以下命令查看是哪一天创建的
date -d "1970-01-01 17984 days"
2019年 03月 29日 星期五 00:00:00 CST
最小修改时间
最小修改时间间隔指的是小于间隔时间不得修改密码,设为0则可以随时修改,主要是为了避免频繁修改代码
密码有效期
密码有效期代表允许密码多少天内可以不修改
告警天数
密码警告天数,在设置了有效期之后提前多少天提醒用户修改密码
过期宽限时间,过期后多少天以内可以使用,为空或者为-1代表永不过期,过期后则不可以再登录
账号失效时间
账号失效时间,该账号只准使用多少天,超过这个天数则不可以再使用
chage命令
以上信息可以通过以下命令获取,实际还是读取的该文件,只不过进行了格式化输出:
# chage -l root
Last password change : 3月 29, 2019
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
该命令除了查看配置参数意外还可以进行配置,相应的参数如下:
-d, --lastday LAST_DAY set date of last password change to LAST_DAY
-E, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-h, --help display this help message and exit
-I, --inactive INACTIVE set password inactive after expiration
to INACTIVE
-l, --list show account aging information
-m, --mindays MIN_DAYS set minimum number of days before password
change to MIN_DAYS
-M, --maxdays MAX_DAYS set maximim number of days before password
change to MAX_DAYS
-R, --root CHROOT_DIR directory to chroot into
-W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS
其实这个命令只是做了一层校验,防止将配置文件修改错误,跟vipw
这个命令类似。
vipw & vigr命令
这两个命令最主要就是会给文件加锁!以免在编辑文件时!其他用户也在同时使用文件!而造成其他用户修改的不成功!以下为官方简介:
The vipw and vigr commands edits the files /etc/passwd and
/etc/group, respectively. With the -s flag, they will edit the shadow
versions of those files, /etc/shadow and /etc/gshadow, respectively.
The programs will set the appropriate locks to prevent file
corruption. When looking for an editor, the programs will first try
the environment variable $VISUAL, then the environment variable
$EDITOR, and finally the default editor, vi(1).
对应修改的文件如下:
vipw 修改/etc/passwd文件
vipw –s 修改/etc/shadow文件
vigr 修改/etc/groups文件
vigr –s 修改/etc/
忘记密码
普通用户忘记密码可以通过root用户来设置,root用户要是忘记密码进入单用户模式,执行passwd root
修改密码即可,不过不同的发行版本可能有一定差异。
/etc/group
用户组的所有信息都存放在/etc/group文件中,用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段,用户与用户组是多对对的关系
cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
.....
该文件有四个字段:组名:密码:组ID:组内用户列表
组名
该小组的名称,理论上不能重复,可以由字母和数字构成
密码
这里跟passwd文件中类似,实际存储在/etc/gshadow
文件中,实际工作中需要调整组信息一般用root代替,这里是为了设置组管理员的,一般使用不到。
组ID
一般称为GID,跟UID一样,实际Linux中文件也是通过id也标识的,名字只是为了方便用户记忆和识别。
组用户
该群组包含的所有用户,使用,
分割
/etc/gshadow
/etc/gshadow和/etc/group是互补的两个文件,跟上面的用户管理文件类似,
cat /etc/gshadow
root:*::
daemon:*::
bin:*::
sys:*::
分别是用户组、密码、管理者、组成员(附加用户),比较简单就不详细介绍了。
相关命令
用户账号的管理工作主要涉及到用户账号的添加、修改和删除,以及所属组的管理,本质上可以抽象为增删改查。
用户
用户管理主要是新建用户、用户后续的信息修改等。
新建用户
useradd创建一个新用户,常见参数如下:
-u UID:指定 UID,这个 UID 必须是大于等于500,并没有其他用户占用的 UID
-g GID/GROUPNAME:指定默认组,可以是 GID 或者 GROUPNAME,同样也必须真实存在
-G GROUPS:指定额外组
-c COMMENT:指定用户的注释信息
-d PATH:指定用户的家目录
一般我们穿件用户都会穿件相应的用户组和家目录,所以最长使用以下命令:
useradd -s /bin/bash -m user_name
删除用户
如果一个用户的账号不再使用,可以从系统中删除,使用userdel命令,不加-r
参数只是删除用户,但还保留用户家目录,加上之后则完全删除。
userdel -r sam
修改用户
更改用户的有关属性,如用户号、主目录、用户组、登录Shell等,使用usermod
命令。
修改用户名
usermod -l old_name new_name
修改家目录
需要root用户执行
usermod -d /home/old_name -m ole_name
```bash
##### 修改组名
```bash
groupmod -n old_g_name new_g_name
修改密码
后面跟上用户名可以修改其他用户的密码,前提是有权限。
passwd
Enter new UNIX password:
其他命令可以自行查看手册。
组
用户组的管理涉及用户组的添加、删除和修改,跟上面的用户管理一样,本质也都是对对应文件的修改。
创建组
一般是直接创建组或者指定GID创建组,
groupadd g_name
groupadd -g $gid g_name
删除组
groupdel group_name
修改组
那就是修改组id或者组名了,后面只有一个组名则只是修GID,否则是同时修改
groupmod –g $gid -n group_new_name group_old_name