学科分类
目录
Linux编程

sudo

虽然su命令使用起来很方便,但使用su命令切换用户时,需要知道要切换的用户的密码,su命令是不安全的。试想一下,当前系统中有多个用户,若每个用户都需要执行部分root权限,那么这些用户都必须知道root用户的密码,而且在切换到root用户后,每个用户都可以执行完整的root权限,这样系统的安全性就没有了保障,因此su是一个不安全的命令,那么若不使用su命令,用户该如何提升权限呢?

Linux中还提供了另外一个用户切换的命令——sudo。sudo的命令格式如下:

sudo [选项]u 用户 [命令]

sudo可以视为受限的su,它能使“部分”用户使用其他用户的身份执行命令,若要使用root的权限,使用root用户的身份即可。而若要允许用户使用root身份,需将用户名添加到/etc/sudoers中,该操作由root用户完成。存在于/etc/sudoers中的用户只需知道自己的密码便可使用root身份;若root用户要使用其他用户的身份,可以不必输入密码。密码匹配正确后,在之后的5分组内有效,超过5分钟需再次输入密码。

sudo命令常用的选项如表1所示。

表1 userdel命令常用选项

参数 说明
-b 在后台执行命令
-h 显示帮助
-H 将HOME环境变量设置为新身份的HOME环境变量
-k 结束密码的有效期限
-l 列出目前用户可执行与无法执行的命令
-p 改变询问密码的提示符号
-s 执行指定的shell
-u 以指定的用户作为新的身份,即切换到指定用户。默认切换到root用户

sudoers文件是有一定语法规范的,因此最好不要使用vi编辑器直接对它进行编辑,否则一旦出现错误,可能会对sudo的使用造成影响,或者产生其它不良后果。

Linux系统中通常使用命令visudo打开sudoers文件并进行编辑,visudo命令实质上仍是通过vi编辑器打开/etc/sudoers文件,但使用该命令打开sudoers文件进行编辑时可以防止其它的用户同时修改该文件,且在保存退出时,系统会对sudoers文件的语法进行检查。当然这个命令也不是所有用户都能使用的,下面我们通过root用户编辑sudoers文件,为其它用户提升权限。

首先使用su命令切换至root用户,之后在root用户下打开sudoers文件:

[itheima@localhost ~]$ su -
Password: 
[root@localhost ~]# visudo

观察sudoers文件,可以在其中找到如下的语句:

## Allow root to run any commands anywhere
root  ALL=(ALL)    ALL

第一条语句是注释行,第二条语句是对root用户的权限设置,它的作用是:使root用户能够在任何情境下执行任何命令。此条语句中除了等号外都是参数,参数对应的含义如下:

账户名 主机名称=(可切换的身份) 可用的命令

① 账户名。该参数是要设置权限的账号名,只有账号名被写入sudoers文件时,该用户才能使用sudo命令。root用户默认可以使用sudo命令。

② 主机名称。该参数决定此条语句中账户名对应的用户可以从哪些网络主机连接当前Linux主机,root用户默认可以来自任何一台网络主机。

③ 可切换的身份。该参数决定此条语句中的用户可以在哪些用户身份之间进行切换,执行哪些命令。root用户默认可切换为任何用户。

④ 可执行的命令。该参数指定此条语句中的用户可以执行哪些命令。注意,命令的路径应为绝对路径。root用户默认可以使用任何命令。

以上语句中的参数“ALL”是一个特殊的关键字,分别代表任何主机、身份与命令。

掌握语句的含义之后,我们来为一些普通用户设置一些新的权限。

案例13:使用户itheima能够以root的身份,使用more命令。

itheima  ALL=(root)/bin/more

保存退出后,切换到用户itheima,使用命令“sudo -l”查看该用户可以使用的命令,输出结果如下:

[itheima@localhost ~]$ sudo -l
[sudo] password for itheima:        #输入用户itheima的密码
Matching Defaults entries for itheima on this host:
  !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME
  HISTSIZE INPUTRC 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 itheima may run the following commands on this host:
  (root) /bin/more

注意,在执行sudo命令后,输入的密码是当前用户的密码。

观察输出结果的最后两行,这两行显示了itheima当前可以执行的命令。最后一行的“(root) /bin/more”表示用户可以以root的身份执行bin目录下的more命令。此时在命令行输入如下命令:

[itheima@localhost ~]$ sudo more /etc/shadow

原本无法被普通用户查看的/etc/shadow文件将会被输出。注意在使用时sudo不能省略。

案例14:使用户itheima能够以以root的身份执行/bin/more,能以任何用户的身份执行/etc/chmod。

itheima  ALL=(root)/bin/more,/etc/chmod

通过在配置文件中逐条添加配置信息的方法提升用户权限在一定程度上保障了系统安全,但当需要操作的用户较多时,如此操作显然相对麻烦。Linux系统支持为用户组内的整组用户统一设置权限。

再次使用visudo打开配置文件,往下翻几行,会看到如下的语句:

# %wheel    ALL=(ALL)    ALL

此条语句表示任何加入用户组wheel的用户,都能通过任意主机连接、以任何身份执行任意的命令,所以若你想提升某些用户的权限为ALL,将它们添加到用户组wheel中即可。当然此条语句前的“#”仍然表示注释,若要使此条命令生效,需将“#”删除。

案例15:使用户组itheima中的所有用户,能以root的身份执行命令/bin/more。

%itheima  ALL=(root)/bin/more

“%”表示这是一个用户组。

root作为系统中唯一的超级用户,其权限极大,可以执行的命令极多,其中不乏非常危险的命令,如rm –rf。若是一个普通用户的权限被提升的太多,很可能会威及整个系统,为了防止这种情况,sudo命令中可以在配置sudoers文件时,对某些用户的权限进行控制。假如在itheima用户被提升至root权限时,要禁止该用户使用/bin/more命令,可以使用以下语句:

itheima  ALL=(root) !/bin/more

如上所示,通过“!命令”的形式,便可禁止用户执行某些命令。

image-20200629185714123多学一招:sudo的执行流程

通过学习,相信大家对sudo命令内部的执行流程有所把握,为了帮助读者更好地理解sudo命令,特对sudo的执行流程进行说明:

当用户使用sudo命令时,系统会首先在/etc/sudoers文件中查找该用户是否有执行sudo的权限:若有权限,则提示用户输入自己的密码;否则给出错误提示。若密码匹配成功,则执行sudo后待执行的命令。

另外,若符合以下几种情况,可以不用输入密码:

① 当前用户为root用户;

② 切换的用户为当前用户;

③ 当被设置为无需提供密码便可使用sudo时。

点击此处
隐藏目录