这个系列的Linux教程主要参考刘遄老师的《Linux就该这么学》。用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间的差异。
目前设计的这个Linux学习系列的目录如下:(会陆续更新~)
- Linux 学习系列一:Linux的简单介绍以及命令行的基本操作
- Linux 学习系列二:Linux中的常用命令
- Linux 学习系列三:管道符、重定向与环境变量
- Linux 学习系列四:光速掌握Vim,效率提升神器
- Linux 学习系列五:Shell命令脚本的基本语法
- Linux 学习系列六:用户身份与文件权限
- …
\quad
\quad
Linux是一个多用户、多任务的操作系统,具有很好的稳定性与安全性,在幕后保障Linux系统安全的则是一系列复杂的配置工作。
用户身份与能力
设计Linux系统的初衷之一就是为了满足多个用户同时工作的需求,因此Linux系统必须具备很好的安全性。root管理员就是存在于所有类UNIX系统中的超级用户。它拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备等。
Linux系统的管理员之所以是root,并不是因为它的名字叫root,而是因为该用户的身份号码即UID(User IDentification)的数值为0。在Linux系统中,UID就相当于我们的身份证号码一样具有唯一性,因此可通过用户的UID值来判断用户身份。在RHEL7系统中,用户身份有下面这些。
- 管理员UID为0:系统的管理员用户。
- 系统用户UID为1~999:Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
- 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
需要注意的是,UID是不能冲突的,而且管理员创建的普通用户的UID默认是从1000开始的。
为了方便管理属于同一组的用户,Linux系统中还引入了用户组的概念。通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。另外,在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
useradd
命令
useradd
命令用于创建新的用户,格式为:
useradd [选项] 用户名
使用该命令创建用户账户时,默认的用户家目录会被存放在/home
目录中,默认的Shell解释器为/bin/bash
,而且默认会创建一个与该用户同名的基本用户组。这些默认设置可以根据useradd
的命令参数修改。
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username ) |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
创建一个普通用户并指定家目录的路径、用户的UID以及Shell解释器。在下面的命令中,请注意/sbin/nologin
,它是终端解释器中的一员,与Bash解释器有着天壤之别。一旦用户的解释器被设置为nologin
,则代表该用户不能登录到系统中:
[root@wz ~]# useradd -d /home/gaga -u 8888 -s /sbin.nologin gaga
[root@wz ~]# id gaga
uid=8888(gaga) gid=8888(gaga) groups=8888(gaga)
groupadd
命令
groupadd
命令用于创建用户组,格式为:
groupadd [选项] 群组名
为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。创建用户组的步骤非常简单,例如使用如下命令创建一个用户组ronny
:
groupadd ronny
usermod
命令
usermod
命令用于修改用户的属性,格式为:
usermod [选项] 用户名
Linux系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd
文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod
命令修改已经创建的用户信息,诸如用户的UID、基本/扩展用户组、默认终端等。usermod
命令的参数以及作用如表所示:
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d-m | -m 与-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
将用户gaga
加入到root
用户组中,这样扩展组列表中则会出现root
用户组的字样,而基本组不会受到影响:
[lucky@wz ~]$ sudo usermod -G root gaga
[lucky@wz ~]$ id gaga
uid=8888(gaga) gid=8888(gaga) groups=8888(gaga),0(root)
用-u
参数修改gaga
用户的UID
号码值。
[lucky@wz ~]$ id gaga
uid=9999(gaga) gid=8888(gaga) groups=8888(gaga),0(root)
passwd
命令
passwd
命令用于修改用户密码、过期时间、认证信息等,格式为:
passwd [选项] [用户名]
普通用户只能使用passwd
命令修改自身的系统密码,而root
管理员则有权限修改其他所有人的密码。更酷的是,root
管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便。既然root
管理员可以修改其他用户的密码,就表示完全拥有该用户的管理权限。passwd
命令中可用的参数以及作用如表:
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
--stdin | 允许通过标准输入修改用户密码 |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
通过标准输入修改用户密码,如
[root@wz ~] echo "123" | passwd --stdin lucky
使用passwd
命令禁止该用户登录系统和允许登陆系统:
[root@wz ~]# passwd -l lucky
Locking password for user lucky.
passwd: Success
[root@wz ~]# passwd -S lucky
lucky LK 2022-01-17 0 99999 7 -1 (Password locked.)
[root@wz ~]# passwd -u lucky
Unlocking password for user lucky.
passwd: Success
userdel
命令
userdel
命令用于删除用户,格式为:
userdel [选项] 用户名
如果我们确认某位用户后续不再会登录到系统中,则可以通过userdel
命令删除该用户的所有信息。在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用-r
参数将其删除。userdel
命令的参与以及作用如表:
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及用户家目录 |
使用userdel
命令将gaga
用户删除,其操作如下:
[root@wz ~]# userdel -r gaga
[root@wz ~]# id gaga
id: ‘gaga’: no such user
文件权限与归属
尽管在Linux系统中一切都是文件,但是每个文件的类型不尽相同,因此Linux系统使用了不同的字符来加以区分,常见的字符如下所示。
-
:普通文件d
:目录文件l
:链接文件b
:块设备文件c
:字符设备文件p
:管道文件
Linux系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。
对于一般文件来说:
- “可读”表示能够读取文件的实际内容;
- “可写”表示能够编辑、新增、修改、删除文件的实际内容;
- “可执行”则表示能够运行一个脚本程序。
对目录文件来说:
- “可读”表示能够读取目录内的文件列表;
- “可写”表示能够在目录内新增、删除、重命名文件;
- “可执行”则表示能够进入该目录。
文件的读、写、执行权限可以简写为rwx
,亦可分别用数字4、2、1来表示,文件所有者,所属组及其他用户权限之间无关联,如下表:
权限分配 | 文件所有者 | 文件所属组 | 其他用户 | ||||||
---|---|---|---|---|---|---|---|---|---|
权限项 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 |
字符表示 | r | w | x | r | w | x | r | w | x |
数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |
文件权限的数字法表示基于字符表示(rwx
)的权限计算而来,其目的是简化权限的表示。
例如:
- 若某个文件的权限为7,则代表可读、可写、可执行(4+2+1);
- 若某个文件的权限为6,则代表可读、可写(4+2)。
- 现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是
rwxrw-r--
,数字法表示即为764。
下面的结果包含了文件(目录)的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。
[root@wz /]# ll home
total 4
drwx------. 15 lucky lucky 4096 Jun 27 08:18 lucky
文件的特殊权限
在复杂多变的生产环境中,单纯设置文件的rwx
权限无法满足我们对安全和灵活性的需求,因此便有了SUID
、SGID
与SBIT
的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
SUID
SUID
是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。这是一种有条件的、临时的特殊权限授权方法。
例如,所有用户都可以执行passwd
命令来修改自己的用户密码,而用户密码保存在/etc/shadow
文件中。仔细查看这个文件就会发现它的默认权限是000
,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd
命令时如果加上SUID
特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow
文件中。
查看passwd
命令属性时发现所有者的权限由rwx
变成了rws
,其中x
改变成s
就意味着该文件被赋予了SUID权限。
[root@wz /]# ll /etc/shadow
----------. 1 root root 1339 Jun 27 08:23 /etc/shadow
[root@wz /]# ll /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 12 2018 /bin/passwd
注意:如果原先权限位上没有x
执行权限,那么被赋予特殊权限后将变成大写的S
,如果原先权限位上x
执行权限,那么被赋予特殊权限后将变成小写的s
。
SGID
SGID
主要实现如下两种功能:
- 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
- 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
SGID
的第一种功能是参考SUID
而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。
每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID
特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是SGID
的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组。
[root@wz /]# cd /tmp
[root@wz tmp]# mkdir testdir
[root@wz tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Jun 27 09:43 testdir/
[root@wz tmp]# chmod -Rf 777 testdir/
[root@wz tmp]# ls -ald testdir/
drwxrwxrwx. 2 root root 6 Jun 27 09:43 testdir/
[root@wz tmp]# chmod -Rf g+s testdir/
[root@wz tmp]# ls -ald testdir/
drwxrwsrwx. 2 root root 6 Jun 27 09:43 testdir/
在使用上述命令设置好目录的777
权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID
特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:
[root@wz tmp]# su - lucky
[lucky@wz ~]$ cd /tmp/testdir/
[lucky@wz testdir]$ echo "lucky" > test
[lucky@wz testdir]$ ll
total 4
-rw-rw-r--. 1 lucky root 6 Jun 27 09:46 test
下面介绍两个命令:
chmod
命令
chmod
命令来自于英文词组”change mode“的缩写,其功能是用于改变文件或目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己文件的权限属性。设置权限时可以使用数字法,亦可使用字母表达式,对于目录文件建议加入-R
参数进行递归操作,意味着不仅对于目录本身,也对目录内的子文件/目录都进行新权限的设定。
chmod
命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为:
chmod [参数] 权限 文件或目录名称
如果要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可、其他人没有任何权限,则相应的字符法表示为rwxrw----
,其对应的数字法表示为760
。来看两个例子:
- 设定某个文件的权限为775:
[lucky@wz ~]$ chmod 775 anaconda-ks.cfg
- 设定某个文件让任何人都可以读取:
[lucky@wz ~]$ chmod a+r anaconda-ks.cfg
chown
命令
chown
命令来自于英文词组”Change owner“的缩写,其功能是用于改变文件或目录的用户和用户组信息。管理员可以改变一切文件的所属信息,而普通用户只能改变自己文件的所属信息。其格式为:
chown [参数] 所有者:所属组 文件或目录名称
chmod
和chown
命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R
来表示递归操作,即对目录内所有的文件进行整体操作。
[root@wz testdir]# chown root:bin test
[root@wz testdir]# ll test
-rw-rw-r--. 1 root bin 6 Jun 27 09:46 test
SBIT
SBIT
特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT
粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作。
RHEL7系统中的/tmp
作为一个共享文件的目录,默认已经设置了SBIT
特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。
与前面所讲的SUID
和SGID
权限显示方法不同,当目录被设置SBIT
特殊权限位后,文件的其他人权限部分的x
执行权限就会被替换成t
或者T
,原本有x
执行权限则会写成t
,原本没有x
执行权限则会被写成T
。
[lucky@wz testdir]$ ls -ald /tmp
drwxrwxrwt. 21 root root 4096 Jun 27 09:50 /tmp
[lucky@wz testdir]$ cd /tmp
[lucky@wz tmp]$ ls -ald
drwxrwxrwt. 21 root root 4096 Jun 27 09:50 .
[lucky@wz tmp]$ echo "lucky" > test
[lucky@wz tmp]$ ls -alt test
-rw-rw-r--. 1 lucky lucky 6 Jun 27 09:54 test
[lucky@wz tmp]$ chmod 777 test
[lucky@wz tmp]$ ls -al test
-rwxrwxrwx. 1 lucky lucky 6 Jun 27 09:54 test
文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。切换到另外一个普通用户,然后尝试删除这个其他人创建的文件就会发现,即便读、写、执行权限全开,但是由于SBIT
特殊权限位的缘故,依然无法删除该文件:
[gaga@wz tmp]$ ll test
-rwxrwxrwx. 1 lucky lucky 6 Jun 27 09:54 test
[gaga@wz tmp]$ rm -rf test
rm: cannot remove 'test': Operation not permitted
如果想对其他目录来设置SBIT
特殊权限位,可以用chmod
命令,对应的参数o+t
代表设置SBIT
粘滞位权限:
[root@wz ~]# mkdir test
[root@wz ~]# chmod -R o+t test/
[root@wz ~]# ls -ld test/
drwxr-xr-t. 2 root root 6 Jun 27 09:59 test/
文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,默认情况下不能直接被用户发觉,这在一定程度上阻止了黑客篡改系统日志的图谋,因此这种“奇怪”的文件也保障了Linux系统的安全性。
chattr
命令
chattr
命令用于设置文件的隐藏权限,格式为:
chattr [参数] 文件
- 如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“
+参数
” - 如果想要把某个隐藏功能移出文件,则需要追加“
-参数
”。
chattr
命令中可供选择的隐藏权限参数如下:
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(AppendOnly) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump 命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
X | 可以直接访问压缩文件中的内容 |
新建一个普通文件,并为其设置不允许删除与覆盖(+a
参数)权限,然后尝试将这个文件删除:
[root@wz gaga]# echo "hello world" > hello.txt
[root@wz gaga]# ll hello.txt
-rw-rw-r--. 1 gaga gaga 12 Jun 27 21:02 hello.txt
[root@wz gaga]# chattr +a hello.txt
[root@wz gaga]# rm -rf hello.txt
rm: cannot remove 'hello.txt': Operation not permitted
lsattr
命令
lsattr
命令用于显示文件的隐藏权限,格式为:
lsattr [参数] 文件
在Linux系统中,文件的隐藏权限必须使用lsattr
命令来查看,平时使用的ls
之类的命令则看不出端倪:
[root@wz gaga]# ll hello.txt
-rw-rw-r--. 1 gaga gaga 12 Jun 27 21:02 hello.txt
使用lsattr
命令后,文件上被赋予的隐藏权限就会显示出来。此时可以按照显示的隐藏权限的类型(字母),使用chattr
命令将其去掉:
[root@wz gaga]# lsattr hello.txt
-----a------------ hello.txt
[root@wz gaga]# chattr -a hello.txt
[root@wz gaga]# lsattr hello.txt
------------------ hello.txt
[root@wz gaga]# rm hello.txt
rm: remove regular file 'hello.txt'? y
[root@wz gaga]# ll
total 0
文件访问控制列表
前面说的一般权限、特殊权限、隐藏权限其实有一个共性:权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,
- 如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;
- 若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
切换到普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户对root管理员的家目录设置ACL之前,其执行结果如下所示:
[root@wz gaga]# su - gaga
[gaga@wz ~]$ cd /root
-bash: cd: /root: Permission denied
setfacl
命令
setfacl
命令用于管理文件的ACL规则,格式为:
setfacl [参数] 文件名称
文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,
- 针对目录文件需要使用
-R
递归参数; - 针对普通文件则使用
-m
参数; - 如果想要删除某个文件的ACL,则可以使用
-b
参数。
下面来设置用户在/root
目录上的权限:
[root@wz gaga]# setfacl -Rm u:gaga:rwx /root
[root@wz gaga]# su - gaga
[gaga@wz ~]$ cd /root
[gaga@wz root]$ ll
total 16
-rw-rwx---+ 1 root root 1223 Jan 18 11:03 anaconda-ks.cfg
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Desktop
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Documents
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Downloads
-rw-rwxr--+ 1 root root 207 Feb 25 03:00 haha.sh
-rw-rwxr--+ 1 root root 1378 Jan 18 11:11 initial-setup-ks.cfg
-rw-rwxr--+ 1 root root 42 Feb 25 02:50 ip.txt
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Music
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Pictures
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Public
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Templates
drwxrwxr-t+ 2 root root 6 Jun 27 09:59 test
drwxrwxr-x+ 2 root root 6 Feb 25 02:49 Videos
常用的ls
命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.
)变成了加号(+
),这就意味着该文件已经设置了ACL了。
getfacl
命令
getfacl
命令用于显示文件上设置的ACL信息,格式为:
getfacl 文件名称
下面使用getfacl
命令显示在root管理员家目录上设置的所有ACL信息。
[root@wz gaga]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:gaga:rwx
group::r-x
mask::rwx
other::---
su
命令与sudo
服务
su
命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root管理员切换至普通用户:
[root@wz gaga]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@wz gaga]# su - gaga
[gaga@wz ~]$ id
uid=1001(gaga) gid=1001(gaga) groups=1001(gaga) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
su
命令与用户名之间的减号意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号。另外,当从root管理员切换到普通用户时不需要密码验证,而从普通用户切换成root管理员需要进行密码验证。
尽管像上面这样使用su
命令后,普通用户可以完全切换到root管理员身份来完成相应工作,但这将暴露root管理员的密码,从而增大了系统密码被黑客获取的几率;这并不是最安全的方案。我们可以使用sudo
命令把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露root管理员密码。
我们要做的就是合理配置sudo
服务,以便兼顾系统的安全性和用户的便捷性。sudo
服务的配置原则:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo
命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为:
sudo [参数] 命令名称
sudo
服务中可用的参数以及相应的作用如下表:
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u | 用户名或UID值以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
总结来说,sudo
命令具有如下功能:
- 限制用户执行指定的命令:
- 记录用户执行的每一条命令;
- 配置文件(
/etc/sudoers
)提供集中的用户管理、权限与主机等参数; - 验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
如果担心直接修改配置文件会出现问题,则可以使用sudo
命令提供的visudo
命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers
配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
只有root管理员才可以使用
visudo
命令编辑sudo
服务的配置文件。
使用visudo
命令配置sudo
命令的配置文件时,其操作方法与Vim编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出。在sudo
命令的配置文件中,按照下面的格式将第99行(大约)填写上指定的信息:
[lucky@wz ~]$ sudo -l
[sudo] password for lucky:
Matching Defaults entries for lucky on wz:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset,
env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR
USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User lucky may run the following commands on wz:
(ALL) ALL
(ALL) ALL
作为一名普通用户,是肯定不能看到/root
中的文件信息的,但是,只需要在想执行的命令前面加上sudo
命令就可以了:
[lucky@wz ~]$ ls /root
ls: cannot open directory '/root': Permission denied
[lucky@wz ~]$ sudo ls /root
anaconda-ks.cfg Documents haha.sh ip.txt Pictures Templates Videos
Desktop Downloads initial-setup-ks.cfg Music Public test
[lucky@wz ~]$
考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权,因此ALL
参数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用whereis
命令找出命令所对应的保存路径,然后把配置文件第99行的用户权限参数修改成对应的路径即可:
[root@wz ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@wz ~]# visudo
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
lucky ALL=(ALL) /usr/bin/cat
再次切换到指定的普通用户,然后尝试正常查看某个文件的内容,此时系统提示没有权限。这时再使用sudo
命令就可以顺利地查看文件内容了:
[root@wz ~]# su - lucky
[lucky@wz ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[lucky@wz ~]$ sudo cat /etc/shadow
[sudo] password for lucky:
root:$6$xC4ecj/DKOqB2cSt$qW3BMXEvgd6jdMTRhorGP0xiTCoS8gM64g2wS1CrnGNd0GeDJQrGxm9bnFA5Pg1hs3z0iym0f6hX/lHmj5JNe1:19153:0:99999:7:::
bin:*:17784:0:99999:7:::
daemon:*:17784:0:99999:7:::
adm:*:17784:0:99999:7:::
每次执行sudo
命令后都会要求验证一下密码挺麻烦的,这时可以添加NOPASSWD
参数,使得用户执行sudo
命令时不再需要密码验证:
[root@wz ~]# visudo
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff