用户身份和文件权限

 前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 

目录

一、用户身份与能力

二、文件权限与归属

三、文件的特殊权限

四、文件的隐藏属性

五、文件访问控制列表

六、su命令和sudo服务

致谢


一、用户身份与能力

在Linux系统中,UID就相当于身份证号码一样具有唯一性,因此可通过用户的UID值来判断用户的身份。在RHEL8中,用户身份有:

  • 管理员UID为0:系统的管理员用户
  • 系统用户UID为1~999:Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围
  • 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户

Linux系统中还引入了用户组的概念。通过使用用户组号码(GID,可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务

另外,在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而这个用户组只有该用户一个人。如果该用户以后被纳入其他组,则这个其他用户组被称之为扩展用户组一个用户只有一个基本用户组,但是可以有多个扩展用户组

1、id命令

id命令用于显示用户详细信息,语法:“id 用户名

 [root@linuxprobe ~]# id leeuid=1000(lee) gid=1000(lee) groups=1000(lee),10(wheel)

2、useradd命令

useradd用于创建新的用户账户,语法:“useradd [参数] 用户名”

可以使用useradd命令创建用户。使用该命令创建用户账号时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组

参数作用
-d指定用户的家目录(默认为/home/username)
-e账户的到期时间,格式为YYYY-MM-DD
-u指定该用户的默认UID
-g指定一个初始的用户基本组(必须已存在)
-G指定一个或多个扩展用户组
-N不创建与用户同名的基本用户组
-s指定该用户的默认Shell解释器

示例:创建一个名为linuxcoo1的用户,并使用id命令确认信息:

 [root@linuxprobe ~]# useradd linuxcoo1[root@linuxprobe ~]# id linuxcoo1uid=1009(linuxcoo1) gid=1009(linuxcoo1) groups=1009(linuxcoo1)

提高难度:创建一个普通用户并指定家目录路径、用户的UID以及Shell解释器。

 # 注意/sbin/nologin,是终端解释器中的一员,与Bash解释器有天壤之别。一旦被设置成这个,则代表用户不能登录到系统中:[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxdown[root@linuxprobe ~]# id linuxdownuid=8888(linuxdown) gid=8888(linuxdown) groups=8888(linuxdown)

3、groupadd命令

groupadd命令用于创建新的用户组,语法:“groupadd [参数] 群组名

 [root@linuxprobe ~]# groupadd ronny

4、usermod命令

usermod命令用于修改用户的属性,语法:“usermod [参数] 用户名

反复强调过,Linux系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,命令参数如下:

参数作用
-c填写用户账户的备注信息
-d -m参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e账户的到期时间,格式为YYYY-MM-DD
-g变更所属用户组
-G变更扩展用户组
-L锁定用户禁止其登录系统
-U解锁用户,允许其登录系统
-s变更默认终端
-u修改用户的UID

示例:再次查看账户lee的信息

 [root@linuxprobe ~]# id leeuid=1000(lee) gid=1000(lee) groups=1000(lee)

然后将用户lee加入到root用户组中,这样扩展组列表中则会出现root用户组的字样,而基本组不会受影响:

 [root@linuxprobe ~]# usermod -G root lee[root@linuxprobe ~]# id leeuid=1000(lee) gid=1000(lee) groups=1000(lee),0(root)

再试试用-u参数修改lee用户的UID值:

 [root@linuxprobe ~]# usermod -u 6666 lee[root@linuxprobe ~]# id leeuid=6666(lee) gid=1000(lee) groups=1000(lee),0(root)

如果吧用户的解释器由默认的/bin/bash修改为/sbin/nologin后会怎样呢?

 [root@linuxprobe ~]# usermod -s /sbin/nologin lee[root@linuxprobe ~]# su - leeThis account is currently not available.

发现,修改后,不能被登录了,但这个用户依然可以被某个服务所调用,管理某个具体的服务。

5、passwd命令

passed命令用于修改用户的密码、过期时间等信息,语法:“passwd [参数] 用户名

普通用户只能使用passwd命令修改自己的系统密码,而root管理员则有权限修改其他人的密码。passwd命令参数如下:

参数作用
-l锁定用户,禁止其登录
-u解除锁定,允许用户登录
--stdin允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username
-d使该用户可用空密码登录系统
-e强制用户在下次登录时修改密码
-S显示用户的密码是否被锁定,以及密码所采用的加密算法名称

示例:修改自己的密码只需要输入命令后敲回车即可:

 [root@linuxprobe ~]# passwdChanging password for user root.New password: Retype new password: passwd: all authentication tokens updated successfully.

修改其他人的密码,首先需要检查当前是否为root管理员权限,然后命令后指定要修改那位用户的名称:

 [root@linuxprobe ~]# passwd leeChanging password for user lee.New password: Retype new password: passwd: all authentication tokens updated successfully.

假如有位同时正在度假,那么可以使用passwd命令禁止该用户登录系统,等休假结束再允许登录:

 [root@linuxprobe ~]# passwd -l leeLocking password for user lee.passwd: Success[root@linuxprobe ~]# passwd -S leelee LK 2024-07-04 0 99999 7 -1 (Password locked.)

6、userdel命令

userdel命令用于删除已有的用户账户,语法:“userdel [参数] 用户名”

在使用userdel命令删除用户信息时,该用户的家目录会默认保留下来,此时可以用-r参数将其删除;

参数作用
-f强制删除用户
-r同时删除用户及家目录

正常情况下删除一个用户时会建议保留他的家目录数据,避免有什么重要的数据被误删除,所以不用加参数,写清要删除的用户名就行:

 [root@linuxprobe ~]# userdel user11[root@linuxprobe ~]# id user11id: ‘user11’: no such user

此时该用户虽然被删除,但家目录数据会继续被存放在/home目录中,确认未来无需使用再手动删除:

 [root@linuxprobe ~]# cd /home[root@linuxprobe home]# lslee  linux  linuxcoo1  user11  user22  workdir[root@linuxprobe home]# rm -rf user11[root@linuxprobe home]# lslee  linux  linuxcoo1  user22  workdir

二、文件权限与归属

在Linux系统中,每个文件都有归属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的读(r)、写(w)、执行(x)等权限。

文件来说:

  • 可读:能够读取文件的实际内容
  • 可写:能够编辑、新增、修改和删除文件的实际内容
  • 可执行:能够运行一个脚本程序

目录来说:

  • 可读:能够读取目录内的文件列表
  • 可写:能够在目录内新增、删除、重命名文件
  • 可执行:能够进入该目录

读写执行权限对于文件与目录可执行命令的区别:

文件目录
读取(r)catls
写入(w)vimtouch
执行(x)./scriptcd

文件权限的字符与数字表示:

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

通过上图得知文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名等信息。分析得知,该文件类型为普通文件,所有者权限为可读、可写,所属组权限为可读,除此之外的其他人只有可读权限,文件的磁盘占用大小是34298字节,最近一次的修改时间是4月2日的凌晨23分,文件的名称是install.log。

其中排在最前面的减号(-)是文件类型:常见的文件类型有:普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)

普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及Shell脚本等,所以几乎在每个目录下都能看到普通文件(-)和目录文件(d)。块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等都是设备文件,主要集中在/dev/目录中

三、文件的特殊权限

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

1、SUID

SUID是一种对二进制程序进行设置的特殊权限,能让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。

例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看会发现它的默认权限是000,也就是说除了root管理者外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时,如果加上SUID特殊权限位,就可以让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。

示例:查看passwd命令属性时发现所有者的权限变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限;如果原本的权限是rw-,没有x执行权限,那么被赋予特殊权限后将变成大写的S

 [root@linuxprobe ~]# ls -l /etc/shadow---------- 1 root root 1587 Jul  4 17:29 /etc/shadow[root@linuxprobe ~]# ls -l /bin/passwd-rwsr-xr-x. 1 root root 33424 Feb  8  2022 /bin/passwd

注意:醒目的红色提醒告诫着用户一定要小心这个权限,因为一旦某个命令文件被设置上了SUID权限,那么就意味着凡是执行的人都可以临时获取到更高的权限,千万不要设置到vim、cat、rm等命令上!!!

2、SGID

SGID特殊权限有两种应用场景:对二进制程序进行设置时,能够让执行者临时获取到文件所有组的权限;而对目录进行设时,则是让目录内新创建的文件自动继承该目录原有用户组的名称

第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限

举例:在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:

 cr--r----- 1 root system 2, 1 Feb 11 2017 kmem

除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可用于在查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:

 -r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps

这样,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而顺利地读取到了设备文件。


前文提到,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)

举例:如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能读取目录中的内容,那么可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)

 [root@linuxprobe ~]# cd /tmp/[root@linuxprobe tmp]# mkdir testdir[root@linuxprobe tmp]# ls -ald testdirdrwxr-xr-x 2 root root 6 Jul  4 19:49 testdir[root@linuxprobe tmp]# chmod -R 777 testdir         # 确保普通用户可以写入文件[root@linuxprobe tmp]# chmod -R g+s testdir         # 为该目录设置SGID特殊权限位[root@linuxprobe tmp]# ls -ald testdirdrwxrwsrwx 2 root root 6 Jul  4 19:49 testdir​# 切换普通用户,尝试在该目录中创建文件,并查看新文件是否会继承文件所在目录的所属组名称[root@linuxprobe tmp]# useradd linuxprobe[root@linuxprobe tmp]# su linuxprobe[linuxprobe@linuxprobe tmp]$ cd /tmp/testdir[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test[linuxprobe@linuxprobe testdir]$ ls -al test -rw-rw-r-- 1 linuxprobe root 15 Jul  4 19:52 test

2.1、chmod命令

chmod命令用于设置文件的一般权限及特殊权限,语法:“chmod [参数] 文件名

这是一个与日常设置文件权限相关的命令,例如要把一个文件的权限设置成其所有着可读可写可执行、所属组可读可写、其他人没设有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法为760。

[root@linuxprobe ~]# ls -l anaconda-ks.cfg 
-rw-------. 1 root root 1084 Jul  3 11:54 anaconda-ks.cfg
[root@linuxprobe ~]# chmod 760 anaconda-ks.cfg 
[root@linuxprobe ~]# ls -l anaconda-ks.cfg 
-rwxrw----. 1 root root 1084 Jul  3 11:54 anaconda-ks.cfg

2.2、chown命令

chown命令用于设置文件的所有者和所有组,语法:“chown 所有者:所有组 文件名

chmod和chown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录操作时需要加上大写参数-R来表示递归操作,即对目录内所有文件进行整体操作

使用“所有者:所有组”的格式更改:

[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg 
[root@linuxprobe ~]# ls -l anaconda-ks.cfg 
-rw-------. 1 linuxprobe linuxprobe 1084 Jul  3 11:54 anaconda-ks.cfg

3、SBIT

SBIT(Sticky Bit)特殊权限又称特殊权限位之粘滞位。SBIT特殊权限可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位后,那么该目录中的文件就只能被其所有着执行删除操作

RHEL 8系统中的/tmp作为一个共享文件的目录,默认已经设置了SBIT特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件

与前面所讲的SUID和SGID权限显示方法不同,当目录被设置成SBIT特殊权限位后,文件的其他人权限部分的x执行权限会被替代成t或者T,原本有x执行权限则会写成t原本没有x执行权限则会写成T

/tmp目录上的SBIT权限默认已经存在,体现为“其他用户”权限字段变为rwt

 [root@linuxprobe ~]# ls -ald /tmpdrwxrwxrwt. 21 root root 4096 Jul  4 22:13 /tmp

其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。之后解释,所以下面还是赋予777权限

 [root@linuxprobe ~]# cd /tmp/[root@linuxprobe tmp]# echo "Welcom to Linuxprobe.com" > test[root@linuxprobe tmp]# chmod 777 test[root@linuxprobe tmp]# ls -al test-rwxrwxrwx 1 root root 25 Jul  4 22:15 test

随后,切换普通用户,尝试删除这个文件,发现即使权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件:

 [root@linuxprobe tmp]# su - linuxprobe[linuxprobe@linuxprobe ~]$ cd /tmp[linuxprobe@linuxprobe tmp]$ rm -f testrm: cannot remove 'test': Operation not permitted

chmod命令设置特殊权限时的参数:

参数作用
u+s设置SUID权限
u-s取消SUID权限
g+s设置SGID权限
g-s取消SGID权限
o+t设置SBIT权限
o-t取消SBIT权限

示例:在家目录中创建一个名为linux的新目录,随后设置上SBIT权限

[linuxprobe@linuxprobe tmp]$ exit
logout
[root@linuxprobe tmp]# cd ~
[root@linuxprobe ~]# mkdir linux
[root@linuxprobe ~]# chmod -R o+t linux/
[root@linuxprobe ~]# ls -ld linux/
drwxr-xr-t 2 root root 6 Jul  4 22:22 linux/

一般权限和特殊权限一起设置。其实SUID、SGID与SBIT也有对应的数字法表示、分别即是4、2、1。也就是说777还不是最大权限,满权限应该是7777,第一个数字代表的是特殊权限位

四、文件的隐藏属性

1、chattr命令

chattr命令用于设置文件的隐藏权限,语法:“chattr [参数] 文件名称

如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移除文件,则需要追加“-参数”。chattr命令中可供选择的隐藏权限参数非常丰富:

参数作用
i无法对文件进行修改;若目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S文件内容在变更后立即同步到硬盘(sync)
s彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A不再修改这个文件或目录的最后访问时间(atime)
b不再修改文件或目录的存取时间
D检查压缩文件中的错误
d使用dump命令备份时忽略本文件/目录
c默认将文件或目录进行压缩
u当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t让文件系统支持尾部合并(tail-merging)
x可以直接访问压缩文件中的内容

示例:新建一个文件,为其设置不允许删除与覆盖(+a参数)权限,然后尝试将这个文件删除:

 [root@linuxprobe ~]# echo "for Test" > linuxprobe[root@linuxprobe ~]# chattr +a linuxprobe[root@linuxprobe ~]# rm linuxproberm: remove regular file 'linuxprobe'? yrm: cannot remove 'linuxprobe': Operation not permitted

2、lsattr命令

lsattr命令用于查看文件的隐藏权限,语法:“lsattr [参数] 文件名称

在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看

 [root@linuxprobe ~]# ls -al linuxprobe-rw-r--r-- 1 root root 9 Jul  4 22:37 linuxprobe[root@linuxprobe ~]# lsattr linuxprobe -----a-------------- linuxprobe

此时按照显示的隐藏权限的类型(字母),使用chattr命令将其去掉:

 [root@linuxprobe ~]# chattr -a linuxprobe [root@linuxprobe ~]# lsattr linuxprobe -------------------- linuxprobe[root@linuxprobe ~]# rm linuxprobe rm: remove regular file 'linuxprobe'? y

一般我们会将-a参数设置到日志文件(/var/log/messages)上面,这样在不影响系统正常写入日志的前提下,还可以防止黑客清理自己的作案证据,如果希望彻底的保护起某个文件,不允许任何人修改和删除的话,试试加上-i参数,效果特别好!!!要想彻底删除某个文件时,可以使用-s参数来保证其被删除后不可恢复

五、文件访问控制列表

上述讲的一般权限、特殊权限、隐藏权限都有一个共性——权限是针对某一类用户设置的,能够对很多人同时生效。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表FACL,File Access Control Lists)。通俗来讲,基于普通文件或目录设置ACL访问控制其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准的派发权限。如果针对某个目录设置了ACL则目录中的文件会继承其权限若针对文件设置了ACL,则文件不再继承其所在目录的权限

示例:切换普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户对root管理员的家目录设置ACL之前,其执行结果:

 [root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ cd /root-bash: cd: /root: Permission denied[linuxprobe@linuxprobe ~]$ exit

1、setfacl命令

setfacl命令用于管理文件的ACL权限规则,语法:“setfacl [参数] 文件名称

ACL权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。此命令参数如下:

参数作用
-m修改权限
-M从文件中读取权限
-x删除某个权限
-b删除全部权限
-R递归子目录

示例:原本我们是无法进入到/root目录中的,现在给这个普通用户单独设置权限:

 [root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root[root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ cd /root/[linuxprobe@linuxprobe root]$ lsanaconda-ks.cfg  Checkkeys.sh  Desktop  Documents  Downloads  Guess.sh  initial-setup-ks.cfg  linux  Music  Pictures  Public  Templates  users.txt  Videos[linuxprobe@linuxprobe root]$ exit

看到文件的权限最后一个点(.)变成了加号(+),这意味着该文件已经设置了ACL了

 [root@linuxprobe ~]# ls -ld /rootdr-xrwx---+ 19 root root 4096 Jul  4 22:41 /root

2、getfacl命令

getfacl命令用于查看文件的ACL权限规则,语法:“getfacl [参数] 文件名称

示例:查看root管理员家目录上设置的所有ACL信息:

 [root@linuxprobe ~]# getfacl /rootgetfacl: Removing leading '/' from absolute path names# file: root# owner: root# group: rootuser::r-xuser:linuxprobe:rwxgroup::r-xmask::rwxother::---​

ACL权限还可以针对某个用户组来设置,例如设置允许某个组的用户都可以读写/etc/fstab个文件:

 [root@linuxprobe ~]# setfacl -m g:linuxprobe:rw /etc/fstab[root@linuxprobe ~]# getfacl /etc/fstabgetfacl: Removing leading '/' from absolute path names# file: etc/fstab# owner: root# group: rootuser::rw-group::r--group:linuxprobe:rw-mask::rw-other::r--

清空所有ACL权限用-b参数指定删除某一条权限就用-x参数

 [root@linuxprobe ~]# setfacl -x g:linuxprobe /etc/fstab[root@linuxprobe ~]# getfacl /etc/fstabgetfacl: Removing leading '/' from absolute path names# file: etc/fstab# owner: root# group: rootuser::rw-group::r--mask::r--other::r--

操作前备份一下,总是好习惯

例如将/home目录上的ACL权限备份一份,要用-R递归参数,这样不仅能够把目录本身的权限备份,里面的文件也都能自动备份

 [root@linuxprobe ~]# getfacl -R /home > backup.aclgetfacl: Removing leading '/' from absolute path names[root@linuxprobe ~]# lsanaconda-ks.cfg  backup.acl   Desktop  Documents  Downloads   initial-setup-ks.cfg  linux  Music  Pictures  Public  Templates   Videos

六、su命令和sudo服务

1、su命令

su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换其他用户:

 [root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ iduid=8889(linuxprobe) gid=8890(linuxprobe) groups=8890(linuxprobe)

su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始信息。强烈建议切换用户时添加这个减号(-)

另外root管理员切换普通用户不需要验证密码,而普通用户切换root用户管理员就需要进行密码验证了;

 [linuxprobe@linuxprobe ~]$ su - rootPassword: [linuxprobe@linuxprobe ~]$ 

授权原则:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限

2、sudo命令

sudo命令用于给普通用户提供额外的权限,语法:“sudo [参数] 用户名

使用sudo命令可以给普通用户提供额外的权限来完成原本只有root管理员才能完成的任务。可以限制用户执行指定的命令、记录用户执行过的每一条命令、集中的管理用户与权限(/etc/sudoers)以及验证密码后一段时间内免验证的方便措施。常见参数如:

参数作用
-h列出帮助信息
-l列出当前用户可执行的命令
-u 用户名或UID值以指定的用户身份执行命令
-k清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-b在后台执行指定的命令
-p更改询问密码的提示语

3、visudo命令

如果担心直接修改配置文件会出现问题,则可以使用sudo命令提供的visudo命令来配置用户权限

visudo命令用于编辑配置用户sudo权限文件,语法:“visudo [参数]

这是一条会自动调用vi编辑器来配置/etc/sudoers权限文件的命令。能够解决多个用户同时修改权限而导致的冲突问题,不仅如此,visudo命令还可以对配置文件内的参数进行语法检查,在发现参数错误时进行报错提醒,比直接修改文件更友好、方便、安全。

配置权限文件时,按照下面格式将第101行(大约)填写上指定信息:

 谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表谁可以使用:稍后要为那位用户进行命令授权允许使用的主机:可以填写ALL代表不限制来源主机,亦可填写如192.168.10.0/24的网段限制来源地址,只有从网段登录时才能使用sudo命令以谁的身份:可以填写ALL代表系统最高权限,也可以是另外一位用户的名字可执行命令的列表:可以填写ALL代表不限制命令的列表,也可填写如/usr/bin/cat的文件名称来限制命令列表,多个文件之间用逗号(,)间隔[root@linuxprobe ~]# visudo99 ## Allow root to run any commands anywhere100 root    ALL=(ALL)       ALL101 linuxprobe ALL=(ALL) ALL

填写完毕后保存退出,然后切换普通用户身份,此时就可以用sudo -l命令查看到所有可执行的命令了

 [root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ sudo -l​We trust you have received the usual lecture from the local SystemAdministrator. It usually boils down to these three things:​#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.​[sudo] password for linuxprobe: Matching Defaults entries for linuxprobe on linuxprobe:!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_ADDRESSLC_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_CHARSETXAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin​User linuxprobe may run the following commands on linuxprobe:(ALL) ALL

下面实验:作为一名普通用户,肯定不能看到root管理员的家目录,但是只要加上sudo命令就可以

[linuxprobe@linuxprobe ~]$ sudo ls /root
anaconda-ks.cfg  backup.acl  Checkkeys.sh  Desktop  Documents  Downloads  Guess.sh  initial-setup-ks.cfg  linux  Music	Pictures  Public  Templates  users.txt	Videos

如果需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,这里可以先使用whereis命令找出命令所对应的保存路径:

[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# whereis reboot
reboot: /usr/sbin/reboot /usr/share/man/man8/reboot.8.gz /usr/share/man/man2/reboot.2.gz
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root    ALL=(ALL)       ALL
101 linuxprobe ALL=(ALL) /usr/bin/cat,/usr/sbin/reboot

每次执行sudo命令都要输入一次密码,这时可以添加NOPASSWD参数使得用户下次执行sudo命令时就不用密码验证了

[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root    ALL=(ALL)       ALL
101 linuxprobe ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot
[linuxprobe@linuxprobe ~]$ reboot
User root is logged in on sshd.
User root is logged in on sshd.
User root is logged in on tty2.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
[linuxprobe@linuxprobe ~]$ sudo reboot	

注意:visudo命令只有root管理员才可以执行,普通用户使用会提示权限不足

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/370636.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动手学深度学习(Pytorch版)代码实践 -计算机视觉-48全连接卷积神经网络(FCN)

48全连接卷积神经网络(FCN) 1.构造函数 import torch import torchvision from torch import nn from torch.nn import functional as F import matplotlib.pyplot as plt import liliPytorch as lp from d2l import torch as d2l# 构造模型 pretrained…

调试支付分回调下载平台证书

之前的原生代码放到webman里面,死活跑不通 没办法,只能用esayWeChat6.7 (自行下载) 它里面配置要用到平台证书 平台证书又要用到 composer require wechatpay/wechatpay 但是请求接口之前,你先要用到一个临时的平台…

linux下高级IO模型

高级IO 1.高级IO模型基本概念1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 IO多路转接1.5 异步IO 2. 模型代码实现2.1 非阻塞IO2.2 多路转接-selectselect函数介绍什么才叫就绪呢?demoselect特点 2.3 多路转接-pollpoll函数介绍poll优缺点demo 2.4 多路转接-epoll&…

【算法笔记自学】第 5 章 入门篇(3)——数学问题

5.1简单数学 #include <cstdio> #include <algorithm> using namespace std; bool cmp(int a,int b){return a>b; } void to_array(int n,int num[]){for(int i0;i<4;i){num[i]n%10;n /10;} } int to_number(int num[]){int sum0;for(int i0;i<4;i){sumsu…

移动端UI风格营造舒适氛围

移动端UI风格营造舒适氛围

Spring容器Bean之XML配置方式

一、首先看applicationContext.xml里的配置项bean 我们采用xml配置文件的方式对bean进行声明和管理&#xff0c;每一个bean标签都代表着需要被创建的对象并通过property标签可以为该类注入其他依赖对象&#xff0c;通过这种方式Spring容器就可以成功知道我们需要创建那些bean实…

cs224n作业3 代码及运行结果

代码里要求用pytorch1.0.0版本&#xff0c;其实不用也可以的。 【删掉run.py里的assert(torch.version “1.0.0”)即可】 代码里面也有提示让你实现什么&#xff0c;弄懂代码什么意思基本就可以了&#xff0c;看多了感觉大框架都大差不差。多看多练慢慢来&#xff0c;加油&am…

Camunda 整合Springboot 实战篇

1.导入依赖 <dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter</artifactId><version>7.18.0</version></dependency><dependency><groupId>org.camunda.b…

C语言图书馆管理系统(管理员版)

案例&#xff1a;图书馆管理系统&#xff08;管理员版&#xff09; 背景&#xff1a; 随着信息技术的发展和普及&#xff0c;传统的图书馆管理方式已经无法满足现代图书馆高效、便捷、智能化的管理需求。传统的手工登记、纸质档案管理不仅耗时耗力&#xff0c;而且容易出现错…

剖析DeFi交易产品之UniswapV3:交易路由合约

本文首发于公众号&#xff1a;Keegan小钢 SwapRouter 合约封装了面向用户的交易接口&#xff0c;但不再像 UniswapV2Router 一样根据不同交易场景拆分为了那么多函数&#xff0c;UniswapV3 的 SwapRouter 核心就只有 4 个交易函数&#xff1a; exactInputSingle&#xff1a;指…

华为机试HJ34图片整理

华为机试HJ34图片整理 题目&#xff1a; 想法&#xff1a; 将输入的字符串中每个字符都转为ASCII码&#xff0c;再通过快速排序进行排序并输出 input_str input() input_list [int(ord(l)) for l in input_str]def partition(arr, low, high):i low - 1pivot arr[high]f…

matlab 有倾斜的椭圆函数图像绘制

matlab 有倾斜的椭圆函数图像绘制 有倾斜的椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 &#xff08;负向&#xff09;绘制结果 x^2 y^2 - xy 1 &#xff08;正向&#xff09;绘制结果 有倾斜的椭圆函数图像绘制 为了确定椭圆的长轴和短轴的…

【Python】MacBook M系列芯片Anaconda下载Pytorch,并开发一个简单的数字识别代码(附带踩坑记录)

文章目录 配置镜像源下载Pytorch验证使用Pytorch进行数字识别 配置镜像源 Anaconda下载完毕之后&#xff0c;有两种方式下载pytorch&#xff0c;一种是用页面可视化的方式去下载&#xff0c;另一种方式就是直接用命令行工具去下载。 但是由于默认的Anaconda走的是外网&#x…

9 redis,memcached,nginx网络组件

课程目标: 1.网络模块要处理哪些事情 2.reactor是怎么处理这些事情的 3.reactor怎么封装 4.网络模块与业务逻辑的关系 5.怎么优化reactor? io函数 函数调用 都有两个作用:io检测 是否就绪 io操作 1. int clientfd = accept(listenfd, &addr, &len); 检测 全连接队列…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术&#xff0c;允许组件之间进行松耦合通信。通过使用事件监听机制&#xff0c;应用程序的各个组件可以在其他组件不直接引用的情况下&#xff0c;相互发送和接受消息。 需求 在技术派中有这样一个需求&#xff0c;当发布文章或…

简单分享下python多态

目录&#xff1a; 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 二、基础的实例 三、多态的优势与应用场景 四、深入理解 一、多态是啥嘞&#xff08;龙生九子各有不同&#xff0c;这就是多态&#xff09; 多态&#xff08;Polymorphism&…

如何利用算法优化广告效果

效果广告以超过67%的占比&#xff0c;成为了中国互联网广告预算的大头。在BAT、字节等大的媒体平台上&#xff0c;效果广告以CPC实时竞价广告为主。在这种广告产品的投放中&#xff0c;广告主或其代理公司通过针对每个广告点击出价&#xff0c;系统自动把这些点击出价换算成eCP…

【人工智能】-- 智能机器人

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;机器人介绍 &#x1f348;机器人硬件 &#x1f34d;机械结构 &#x1f34d;传感器 &#x1f34d;控…

nginx配置尝试

from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse, FileResponse, HTMLResponse import logging import os from datetime import datetime import uvicorn# 初始化日志 logging.basicConfig(filenamefile_server.lo…

学java的第3天 后端商城小程序工作

1.数据库的大坑 特殊字段名 ’我的图片表中有一个字段是描述我写成desc了&#xff0c;正好是mysql中的关键字 就不能使用了 2.后端编写 2.1可以把请求分开 在商品浏览页中 只显示商品的大致信息 当用户再点击其他按钮时在发出请求 2.2把请求合并 把数据整合到一起 利用ass…