Bootstrap

Linux学习系列六:用户身份与文件权限



这个系列的Linux教程主要参考刘遄老师的《Linux就该这么学》。用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间的差异。

目前设计的这个Linux学习系列的目录如下:(会陆续更新~)

  1. Linux 学习系列一:Linux的简单介绍以及命令行的基本操作
  2. Linux 学习系列二:Linux中的常用命令
  3. Linux 学习系列三:管道符、重定向与环境变量
  4. Linux 学习系列四:光速掌握Vim,效率提升神器
  5. Linux 学习系列五:Shell命令脚本的基本语法
  6. 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来表示,文件所有者,所属组及其他用户权限之间无关联,如下表:

权限分配文件所有者文件所属组其他用户
权限项执行执行执行
字符表示rwxrwxrwx
数字表示421421421

文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。

例如:

  1. 若某个文件的权限为7,则代表可读、可写、可执行(4+2+1);
  2. 若某个文件的权限为6,则代表可读、可写(4+2)。
  3. 现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r--,数字法表示即为764。

下面的结果包含了文件(目录)的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。

[root@wz /]# ll home
total 4
drwx------. 15 lucky lucky 4096 Jun 27 08:18 lucky

文件的特殊权限

在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUIDSGIDSBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

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。来看两个例子:

  1. 设定某个文件的权限为775:
[lucky@wz ~]$ chmod 775 anaconda-ks.cfg
  1. 设定某个文件让任何人都可以读取:
[lucky@wz ~]$ chmod a+r anaconda-ks.cfg 

chown命令

chown命令来自于英文词组”Change owner“的缩写,其功能是用于改变文件或目录的用户和用户组信息。管理员可以改变一切文件的所属信息,而普通用户只能改变自己文件的所属信息。其格式为:

chown [参数] 所有者:所属组 文件或目录名称

chmodchown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-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特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。

与前面所讲的SUIDSGID权限显示方法不同,当目录被设置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 
;