user,goup和other概念
linux是一个多用户共享系统,同时可能有多个用户在使用操作系统。用户(user),群组(group)和其他人(other)概念是为了将系统的资源进行隔离,比如文件、设备、目录等,由于在linux中一切皆文件,所以也可以说为了将文件进行隔离。
- user是一个独立的资源拥有单元,用户可以自定义自己文件的权限。
- group是多个用户组成的一个群体,可以对某个文件进行统一授权,当然也可以对每个用户逐一进行授权,但是当用户量不断增加时用group授权是一个更高效的方式。
- other即group内用户以外的用户。也可以针对other来设置权限。
用户和组之间是多对多的关系,一个用户可以添加到多个组中,其中只有一个初始组,其他都是附加组。一个组包含多个用户。
root用户是一个特殊的user,即管理员,它拥有所有文件的访问和操作权限。
/etc/passwd和/etc/shadow文件
默认情况下,linux系统的用户信息都记录在/etc/passwd文件中,与之匹配的还要/etc/shadow文件用来存用户密码的hash值。
/etc/passwd一般是所有用户可读,root可写,/etc/shadow文件一般是root用户可读写,root组用户可读,其他用户无权限。这样设置权限的目的是为了对所有用户暴露用户列表,但是隐藏用户密码hash,防止其他用户读取到root密码hash之后用暴力破解(暴破)的方式获取root密码。
debian1@debian1:~$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2247 5月 4 22:32 /etc/passwd
debian1@debian1:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1262 5月 4 22:32 /etc/shadow
/etc/passwd
以下是我的debian虚拟机上的/etc/passwd文件的部分内容
debian1@debian1:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash # root用户
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...... #省略部分内容
Debian-gdm:x:116:124:Gnome Display Manager:/var/lib/gdm3:/bin/false
debian1:x:1000:1000:debian1,,,:/home/debian1:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
sshd:x:117:65534::/run/sshd:/usr/sbin/nologin
mysql:x:118:125:MySQL Server,,,:/nonexistent:/bin/false
文件中每一行表示一个用户,以":"分割为7个字段,每个字段从前往后分别表示:(以root用户为例)
root:x:0:0:root:/root:/bin/bash
- 用户名:root
- 密码的hash:x表示密码的hash存储在/etc/shadow文件中
- UID:0为root用户ID
- GID:0为root组ID
- 描述:root
- home目录:root用户的home目录为/root
- bash路径:root用户的bash使用的是/bin/bash
UID具有一定的规划,0为root用户ID,1~999(centos7以前是1~499)为伪用户ID,供系统使用,>=1000为普通用户ID。
系统是以UID而不是用户名来识别用户的,所以root不一定是管理员,UID为0的才是,可以将一个普通用户的UID改为0,这样它就成为了管理员。
/etc/shadow
以下是我的debian虚拟机上的/etc/shadow文件的部分内容,可以看到,普通用户没有权限查看改文件内容,需要提权才行
debian1@debian1:~$ cat /etc/shadow
cat: /etc/shadow: 权限不够
debian1@debian1:~$ sudo cat /etc/shadow
[sudo] debian1 的密码:
root:{
mathJaxContainer[0]}j9T{
mathJaxContainer[1]}gMhkN6auOSJlGx330vc2Yr0AoBhUcKoMor5glF81nh1:19348:0:99999:7:::
daemon:*:19348:0:99999:7:::
...... # 省略部分内容
debian1:{
mathJaxContainer[2]}j9T{
mathJaxContainer[3]}BVJ8oXeFst4i6jfNF7mAiXxhzJYa6FFDjEY.BmwRuk3:19348:0:99999:7:::
systemd-coredump:!*:19348::::::
sshd:*:19481:0:99999:7:::
mysql:!:19481:0:99999:7:::
每一行表示一个用户密码信息,以":"分割为9个字段,它们的含义分别如下(摘自:c语言中文网):
- 用户名:同 /etc/passwd 文件的用户名有相同的含义。
- 加密密码:这里保存的是真正加密的密码。
目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效。
所有伪用户的密码都是"!!"或"※",代表没有密码,是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 "!!",代表这个用户没有密码,不能登录。 - 最后一次修改时间:此字段表示最后一次修改密码的时间
可是,为什么 root 用户显示的是 15775 呢?
这是因为,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 15775 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 15775 天修改的 root 用户密码。
那么,到底 15775 代表的是哪一天呢?可以使用如下命令进行换算:[root@localhost ~]# date -d "1970-01-01 15775 days" 2013年03月11日 星期一 00:00:00 CST
可以看到,通过以上命令,即可将其换算为我们习惯的系统日期。
- 最小修改时间间隔:该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
- 密码有效期:经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。
- 密码需要变更前的警告天数:表示当账户密码有效期快到时,系统发出警告信息提前的天数。
该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 "修改密码" 的警告信息。
- 密码过期后的宽限天数:也称为“口令失效日”,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。0表示立即失效,-1表示用用不失效。
- 账号失效时间:同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!该字段通常被使用在具有收费服务的系统中。
- 保留:这个字段目前没有使用,等待新功能的加入。
/etc/group和/etc/gshadow文件
与用户信息类似,linux系统的group信息保存在/etc/group和/etc/gshadow两个文件中。
/etc/group
以下是我debian虚拟机中/etc/group文件的部分内容
debian1@debian1:~$ cat /etc/group
root:x:0:
daemon:x:1:
...... #省略部分内容
scanner:x:120:saned,debian1
Debian-gdm:x:124:
debian1:x:1000:
systemd-coredump:x:999:
mysql:x:125:
每一行表示一个group,用":"分割为4个字段,它们分别表示:
- 组名:root
组密码:x表示密码存储在/etc/gshadow文件中。
用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替
组ID:root组的ID为0
- 组中的用户:表示以此group为附加组的用户名列表,用逗号分割。
由于目前我们很少为组设置密码,所以/etc/gshadow很少使用,这里不记录了。
user和group操作
命令详细用法可以参考:C语言中文网
使用useradd
添加用户
添加用户时若没有指定组,会自动添加同名的组,并将改组作为该用户的初始组。
root@debian1:~# useradd lx
root@debian1:~# cat /etc/passwd | grep lx
lx:x:1001:1001::/home/lx:/bin/sh
在执行useradd命令时提示"bash:useradd:command not found",通过
su root
切换到root用户也不行,但是通过su -
切换之后却能执行,sudo
也能正常执行,一番查询后发现,useradd
命令在/usr/sbin
下,然而根据/etc/profile
的定义,在普通用户启动shell时,不会将/usr/sbin
加入到PATH
中,只有当root
启动shell是才会加入,而su root
只会提权,不会重新加载root的profile,需要手动加载source /etc/profile
。sudo
,sudo -i
和su -
都会自动重新加载profile所以能找到命令。
通过passwd命令修改用户密码
前面在介绍/etc/passwd文件时提到过,如果用户没有设置密码,是不能登录的。
root@debian1:~# passwd lx
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码
使用userdel删除用户
home目录需要手动删除,也可以通过-r
选项自动删除。
root@debian1:~# userdel lx
root@debian1:~# cat /etc/passwd | grep lx
root@debian1:~# rm -rf /home/lx
使用groupadd添加组
root@debian1:~# groupadd test
root@debian1:~# cat /etc/group | grep test
test:x:1001:
使用usermod -G
添加用户的附加组
也可以用-g
选项来修改用户的初始组。可以通过查看/etc/group
文件来查看群组下的用户
root@debian1:~# usermod -G test lx
root@debian1:~# cat /etc/group | grep test
test:x:1003:lx
通过groupdel命令删除组
root@debian1:~# groupdel test
gpasswd命令添加或删除用户
root@debian1:~# gpasswd -a lx test
正在将用户“lx”加入到“test”组中
root@debian1:~# gpasswd -d lx test
正在将用户“lx”从“test”组中删除
通过groups命令查看当前用户所属的组
root@debian1:~# su lx
$ groups
lx test
通过id
命令查看用户id
root@debian1:~# id
用户id=0(root) 组id=0(root) 组=0(root)
用su
切换当前用户
普通用户切换到其他用户需要知道对方密码,root切换到普通用户无需密码。
su -l user
: 切换到user并同时切换用户环境(包括PATH,MAIL等)su user
:只切换用户,不切换用户环境su -
:与su -l root
一致su -l root -c "ls"
:仅切换用户执行一次命令再自动切换回来,-c
后加要执行的命令。
whoami查看当前用户
root@debian1:~# whoami
root