侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

sudo命令详解

zze
zze
2020-01-26 / 0 评论 / 0 点赞 / 511 阅读 / 5366 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

概述

在之前有说过【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 代指用户 netuser1netuser2
  • 用主机别名 NETHOST 代指主机 localhost127.0.0.110.0.1.200
  • 用运行用户别名 NETRUNUSERS 代指用户 rootadminuser1adminuser2
  • 用命令别名 NETADMINCMNDS 代指 /SΩsr/sbin/ip 命令;

最后一行授权配置则表示 NETADMIN 别名代指的用户在主机别名 NETHOST 包含的主机上都可以以 NETRUNUSERS 别名包含的用户的身份来执行命令别名 NETADMINCMNDS 代指的命令。

0

评论区