用户管理
# 用户管理介绍
# 用户的作用
系统会以用户UID来识别不同的用户,我们可以利用用户登录系统、权限管理、进程管理等。
$UID变量记录了当前用户UID。
# 用户组的作用
分组能方便对用户权限的管理,一个用户可以对应多个组,多个用户也可以对应一个组。
# 用户的分类
在Linux中用户可以分为以下三类:
超级管理员用户,最高权限,可登录系统,UID为0。
虚拟用户,可管理进程,但不能登录系统,UID为1到999。
普通用户,可管理指定进程、数据,可登录系统,UID为1000及以上。
在命令提示符中,#为root用户,$为普通用户。
# 用户相关文件
/etc/skel/目录
/etc/skel
目录是用户的家目录文件样板,用户创建时会复制该目录文件到新用户家目录,我们可以放一些运维操作规范说明文件。
该目录下默认有以下几个隐藏文件:
.bash_logout
:当系统退出登录状态会执行的命令。
.bahsrc
:别名和环境变量 (针对用户)。
.bash_profile
:别名和环境变量 (针对用户)。
/etc/passwd文件
该文件是系统的用户信息文件。
例如
root : x : 0 : 0 : root : /root : /bin/bash
信息之间以
:
作为分隔符,各列分别代表以下信息:
用户名信息。
用户密码信息,早期unix用于存放密码,后面因为安全问题改成x。
用户的uid信息。
用户的gid信息。
用户的注释信息。
用户家目录信息。
用户登录系统方式。
/bin/bash:bash解释器
/sbin/nologin:无法登录系统
/etc/shadow文件
该文件是系统的用户密码文件,第二列是加密的密码。
/etc/group文件
该文件是用户组记录文件。
/etc/gshadow文件
该文件是用户组密码信息。
# 系统用户相关命令
# 创建用户命令
useradd [参数] [用户名]
相关参数:
-u [UID]
指定用户的UID数值。
-g [主要用户组]
指定用户的主要用户组。
-G [扩展用户组]
指定用户的扩展用户组。
-c
添加用户的注释信息。
-s /sbin/nologin
指定用户的登录方式。
-M
不创建用户家目录。
例如:
# 创建一个普通用户。
useradd test01
# 创建一个虚拟用户,指定不可登录、无家目录即可。
useradd nobodyone -s /sbin/nologin -M
# 一次创建多个用户方法一
seq 10 | sed -r 's#(.*)#useradd test\1 && echo "123456" | passwd --stdin test\1#g' | bash
# 一次创建多个用户方法二
for num in {1..20};do useradd test$num;done
# 同时创建用户并设置密码,stdin可能会不安全,记得清除历史命令
useradd test ;echo "123456" | passwd --stdin test
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置用户密码命令
passwd [参数] [用户名]
参数:
--stdin
标准输入设置密码 (注意:history会有记录)。
例如:
# 给test用户设置密码
passwd test
# 免交互设置密码,stdin可能会不安全,记得清除历史命令
echo "123456" | passwd --stdin test
2
3
4
5
注意:
企业中设置的密码要复杂,12位以上的字母数字及特殊符号。
# 修改用户命令
usermod [参数] [用户名]
参数:
-s
修改用户的登录方式。
-g
修改用户的主要组信息。
-G
修改用户的扩展组信息。
-u
修改用户的UID。
-c
修改用户的注释信息。
# 删除用户命令
userdel [参数] [用户名]
删除用户时也会同时删除用户的组,如果用户的组还有其他用户,则组会保留。
参数:
-r
删除用户的同时删除该用户的家目录。
# 切换用户命令
通过su [用户名]
命令可以进行用户切换。
env 显示系统环境变量。
su 仅会改变用户家目录的环境变量。
su - 会完全切换到用户的环境变量。
# 查看用户信息
id [用户名]
命令显示用户信息。
last
命令可以查看用户登录的历史时间和IP。
w
命令显示正在登录的用户信息。
登录用户名 登录方式 登录源IP 登录时间 空闲使用时间 消耗CPU资源的时间 用户执行的操作
登录方式:pts/x表示远程登录。tty/x表示本地登录。
# 用户组管理命令
groupadd [参数] [用户名]
创建用户组命令。
groupmod [参数] [用户名]
修改用户组信息命令。
groupdel [参数] [用户名]
删除用户组命令。
# 提权命令
在Linux中root用户可以赋予其他用户或用户组特定权限,使其可以执行特定命令。
visudo
该命令同等于vi /etc/sudoers
但visudo有语法检查,我们可以在其给其他用户配置特定权限。
参考格式:授权的用户名 ALL=(ALL) 要授权的命令路径
/bin/ls, /bin/rm
多个命令授权用", "逗号空格间隔。
/sbin/*, !/sbin/visudo
授权整个命令目录,同时排除部分的命令授权,!加在命令前表示排除。
NOPASSWD: /bin/ls, /bin/rm
加上 NOPASSWD: 使用户sudo时不需要输入用户密码。
例如:centos ALL=(ALL) NOPASSWD:ALL
-c
参数可以检查sudoers文件是否有语法错误。
sudo
可以通过sudo [命令]
来使用被赋予权限的命令,通过sudo -l
可以查看可用命令列表。
# 用户与文件权限管理
# 文件权限介绍
r
可读取文件内容。
w
可编辑文件内容。
x
可执行文件 (需有r权限才有意义)。
# 文件权限测试
root用户可改变任何文件的权限。
---
:可读、可写。
--x
:可执行文件。
属主和其他用户。
---
:不可读、不可写。
r--
:可读、不可写。但是如果用户对所在目录有wx权限则可以强制写入,相当于删除或移动源文件后,新建一份在其中写入。
-w-
:不可读、可写(可>>追加)。
--x
:无法执行、需要同时有r读权限才能执行。
# 目录权限介绍
r
可读取目录中的文件名、属性(需有x权限)等。
w
可对目录中的文件进行添加、删除、移动、复制。
x
可进入目录、读取目录中文件的属性。
读、写权限都必须配合执行权限才能发挥作用。
# 目录权限测试
root用户,root可以改变所有目录的权限。
---
:对目录有所有权限,可增删改查等。
属主和其他用户。
---
:不可查看、创建、删除目录内的文件。
r--
:只可查看文件名 (因为没有x执行权限)。
-w-
:同等于无权限 (因为没有x执行权限)。
--x
:可进入目录 ,但无法查看目录下文件信息,可直接通过文件名访问目录中文件。
rw-
:同等于只有r权限。
r-x
:可切换目录、可读取中的所有信息,如文件名、文件属性等。
-wx
:可切换目录,无法通过ls查看文件夹内的文件,但可以直接指定文件名进行操作。
rwx
:读取目录中的文件名、属性、可增删改查文件。
# 文件访问过程
例如:我们需要
cat /home/test.txt
文件。
- 会先从根目录开始读取,查看用户有没有根目录的执行权限。
- 如果有,则在/根目录根据文件名home找到它的inode号,再根据inode号找到它block指针。
- 然后访问home目录,系统会查看用户有没有home目录的执行权限。
- 如果有则顺利进入home目录,并在home目录中找到其user的inode号和block指针。
- 然后尝试进入user目录,系统再判断用户是否有对user目录的执行权限。
- 如果有,则进入user目录,并根据test文件的inode号找到block信息,并尝试进行读取。
- 系统再判断用户是否有test文件的读权限,如果有则正常读取,如果没有则报错。
# 默认权限命令
Linux文件和目录的默认权限:
普通文件:
644
,保证属主用户可以对文件进行编辑,保证其他用户可以读取文件内容。目录文件:
755
,保证属主用户可以对目录进行编辑,保证其他用户可以读取目录中的信息,可以进入到目录中。
默认权限受umask的值影响,我们如果想修改默认权限,可以通过umask [值]
命令来临时修改,永久修改需要修改/etc/profile文件内原有的。
默认umask值为022
:
文件:
666 - 022(umask) = 644
目录:
777 - 022(umask) = 755
对于文件来说:
umask数值是奇数时结果会+1:
666 - 033(umask) = 633 + 011 = 644
umask数值是偶数时不+1:
666 - 022 = 644
对于目录来说:
umask数值是偶数或奇数都不+1:
777 - 022(umask) = 755
# 修改属主属组命令
我们可以通过chown
命令来设置文件属主和属组。
命令格式中属主和属组的分隔符
:
和.
都行。
# 设置test文件的属主和属组为user
chown user:user test
# 同等于上面
chown user. test
# 递归修改目录内文件的属主和属组
chown -R user. test
2
3
4
5
6
7
8
# 修改权限命令
我们可以通过chmod命令来设置文件的权限位,该命令可以通过字符或数值来进行修改。
字符修改
u
:属主(user)
g
:属组(group)
o
:其他用户(other)
a
:等于以上所有(all)
# 属主追加执行权限。
chmod u+x test
# 属组移除读权限。
chmod g-r test
# 属组追加读写权限。
chmod g+rw test
# 其他人设为读取、执行权限。
chmod o=rx test
# 同等于ugo=rwx。
chmod a=rwx test
2
3
4
5
6
7
8
9
10
11
12
13
14
通过数值进行修改 (更灵活)
# 同等于ugo=rwx。
chmod 777 /home/test
# 同等于u=rwx、go=r。
chmod 744 /home/test
2
3
4
5
特殊权限位
Linux系统中文件除了9个权限位外,实际还有3个特殊权限位,用于实现特殊的需求。
我们可以通过chmod命令来设置他们。
# setuid:将文件属主拥有的权限分配给其他人,例如属主是root,那么其他人也会获得该文件的root权限,设置好会在属主权限位显示s。
chmod u+s test.txt # 或chmod 4777 test.txt
# setgid:将文件属组拥有的能力分配给所有组,设置好会在属组权限位显示s。
chmod g+s test.txt # 或chmod 2777 test.txt
# 粘滞位(sticky bit):一般由共享文件夹使用,使用户即使有目录的777权限,也只能查看目录内他人的文件内容、而无法执行修改、删除、移动、强制保存等操作,当然自己的文件可以操作,有权限写的文件也可以写。
# 另外tmp文件默认有粘滞位权限,如果修改了,某些服务可能会出问题。
chmod o+t test.txt #或chmod 1777 ./tesst
2
3
4
5
6
7
8
9
在一些文件设置了特殊权限后,字母不是小写的s或者t,而是大写的S和T,那代表此文件的特殊权限没有生效,是因为你尚未给它对应用户的x权限。