概述
在之前有说过【su命令的使用】,su
命令名称是 switch user
的缩写,译为切换用户。它的作用是切换当前会话的用户或使用指定的用户身份来运行命令;
sudo
命令的作用和 su
命令相似,也可以让当前会话的用户能够以指定用户的身份来运行命令,它们的不同点如下:
- 使用
su
命令切换到指定用户后就一定拥有了该用户所拥有的所有权限,即su
命令的权限控制的最小粒度为用户; - 而
sudo
命令可以让用户能以指定用户的身份执行我们所指定的部分命令,即sudo
命令的权限控制的最小粒度为单个命令;
使用
sudo
命令的语法格式如下:
sudo [options] COMMAND
options:常用选项;
-l:列出当前用户能够以 sudo 方式运行的命令;
-k:下一次执行 sudo 命令时要验证当前用户密码;
-V:显示版本编号;
-h:显示版本编号及指令的使用方式说明;
-b:将要执行的指令放到后台运行;
-v:因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为 5)会询问密码,这个参数时重新做一次确认,如果超过了 N 分钟也会再次询问密码;
-p prompt:更改询问密码的提示语,其中 %u 会代换为使用者的账号名称,%h 会显示主机名称;
-u username/#uid:不使用此选项时表示要以 root 用户的身份执行指令,而如果使用了此参数则表示以用户名为 username 或用户 ID 为 uid 的用户的身份执行指令;
COMMAND:要以指定用户身份执行的命令;
配置文件
sudo
命令的配置文件为 /etc/sudoers
,该配置文件中默认有效的配置如下:
Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults always_query_group_plugin
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
/etc/sudoers
配置文件可以直接使用vim
进行编辑,还可以直接执行visudo
命令来编辑该文件(推荐),visudo
命令这种方式还附带有语法检查的功能。
授权配置
配置文件中默认的授权操作就是通过上述最后两行配置完成的,这两条配置的格式如下:
users hosts=(runas) commands
users:运行 sudo 命令的用户;
取值可有如下:
以『%group_name』表示一个组中的所有用户;
以『#uid』表示用户 id 为 uid 的用户;
以『username』 表示用户名为 username 的用户;
以『%#gid』 表示组 id 为 gid 的组中的所有用户;
以『USER_ALIAS』表示一个用户别名包含的用户;
有多个以逗号『,』隔开即可,还可使用叹号『!』做取反操作。
hosts:通过哪些主机,如仅允许通过本地主机执行,则可使用 localhost,ALL 表示所有主机;
取值可有如下:
以『hostname』表示一个主机名;
以『ip』表示一个 ip 地址;
以『netaddr』表示一个网络地址;
以『HOST_ALIAS』表示一个主机别名包含的主机;
runas:以哪个用户的身份执行;
取值同 users;
也可以 『RUNAS_ALIAS』 表示一个运行用户别名包含的所有用户;
commands:运行哪些命令;
取值可有如下:
以『/PATH/TO/CMD』绝对路径表示一个命令;
以『/PATH/TO/DIR』表示指定目录下的所有命令;
以『CMD_ALIAS』表示一个命令别名包含的命令;
有多个以逗号『,』隔开即可,还可使用叹号『!』做取反操作。
在该列中还可以以 NOPASSWD 和 PASSWD 来分别指定部分命令的执行不需要校验和需要校验当前用户密码(不可用在命令别名中),看如下示例:
NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/usermod, /usr/bin/passwd
该配置的含义是:
执行 /usr/sbin/useradd 命令不需要校验密码;
执行 /usr/sbin/usermod、/usr/bin/passwd 命令需要校验密码;
其含义为:users(用户)可以通过 hosts(指定的主机)来以 runas(指定的用户)的身份执行 commands(命令)。
所以上述配置文件中最后两行配置含义如下:
- 第一条配置含义为:root 用户可以通过任意主机以任意用户的身份执行任意命令;
- 第二条配置含义为:wheel 组中的用户可以通过任意主机以任意用户的身份执行任意命令;
例
1、添加一个普通用户 user1 并设置密码:
$ useradd user1 && echo user1 | passwd user1 --stdin
2、登录切换到 user1 用户,测试使用 sudo
来执行命令,如下:
$ su - user1
$ sudo fdisk -l
[sudo] user1 的密码:
user1 不在 sudoers 文件中。此事将被报告。
可以看到,由于没有在配置文件中给 user1 用户做相关授权,所以不能以管理员身份成功执行
fdisk -l
命令。
4、退出到管理员环境下,将 wheel 添加为 user1 用户的附加组:
$ exit
$ usermod -a -G wheel user1
5、再次登录切换到 user1
用户,测试使用 sudo
来执行命令,如下:
$ sudo fdisk -l
[sudo] user1 的密码:
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
...
可以看到,由于 user1 现在属于
/etc/sudoers
配置文件中已授权的 wheel 组,所以可以以管理员身份执行命令。
别名配置
在 /etc/sudoers
中还可配置用户别名和命令别名。
看如下配置示例:
# 注意:别名必须为全大写。
User_Alias NETADMIN = netuser1, netuser2
Host_Alias NETHOST = localhost, 127.0.0.1, 10.0.1.200
Runas_Alias NETRUNUSERS = root, adminuser1, adminuser2
Cmnd_Alias NETADMINCMNDS = /usr/sbin/ip
NETADMIN NETHOST=(NETRUNUSERS) NETADMINCMNDS
在上述配置中:
- 用用户别名
NETADMIN
代指用户netuser1
和netuser2
; - 用主机别名
NETHOST
代指主机localhost
、127.0.0.1
和10.0.1.200
; - 用运行用户别名
NETRUNUSERS
代指用户root
、adminuser1
、adminuser2
; - 用命令别名
NETADMINCMNDS
代指/SΩsr/sbin/ip
命令;
最后一行授权配置则表示 NETADMIN
别名代指的用户在主机别名 NETHOST
包含的主机上都可以以 NETRUNUSERS
别名包含的用户的身份来执行命令别名 NETADMINCMNDS
代指的命令。
评论区