点击访问 Linux 命令大全 >>
前面章节介绍了 su 命令提升到 root 权限,避免了输入 root 帐号和密码,这确实能让系统安全了不少。
但是,使用 su 命令提升到 root 用户后,将拥有 root 的所有权限。这不是我们所希望的,我们希望某些用户只拥有部分命令的执行权限。此时,sudo 命令就可以帮我们完成。
sudo 命令语法:
[snow@localhost ~]$ sudo --help sudo - 以其他用户身份执行一条命令 usage: sudo -h | -K | -k | -V usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user] usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command] usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>] usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ... 选项: -A, --askpass 使用助手程序进行密码提示 -b, --background 在后台运行命令 -C, --close-from=num 关闭所有 >= num 的文件描述符 -E, --preserve-env 在执行命令时保留用户环境 --preserve-env=list 保留特定的环境变量 -e, --edit 编辑文件而非执行命令 -g, --group=group 以指定的用户组或 ID 执行命令 -H, --set-home 将 HOME 变量设为目标用户的主目录。 -h, --help 显示帮助消息并退出 -h, --host=host 在主机上运行命令(如果插件支持) -i, --login 以目标用户身份运行一个登录 shell;可同时指定一条命令 -K, --remove-timestamp 完全移除时间戳文件 -k, --reset-timestamp 无效的时间戳文件 -l, --list 列出用户权限或检查某个特定命令;对于长格式,使用两次 -n, --non-interactive 非交互模式,不提示 -P, --preserve-groups 保留组向量,而非设置为目标的组向量 -p, --prompt=prompt 使用指定的密码提示 -r, --role=role 以指定的角色创建 SELinux 安全环境 -S, --stdin 从标准输入读取密码 -s, --shell 以目标用户运行 shell;可同时指定一条命令 -t, --type=type 以指定的类型创建 SELinux 安全环境 -T, --command-timeout=timeout 在达到指定时间限制后终止命令 -U, --other-user=user 在列表模式中显示用户的权限 -u, --user=user 以指定用户或 ID 运行命令(或编辑文件) -V, --version 显示版本信息并退出 -v, --validate 更新用户的时间戳而不执行命令 -- 停止处理命令行参数
sudo 程序接受命令作为参数,并以 root 身份(或者也可以是其他用户)执行它。在执行命令之前,sudo 命令首先需要用户输入口令(如果以 root 身份运行,则输入 root 的口令;如果以其他用户身份运行,则输入其他用户的口令)。处于安全性和方便性,sudo 口令只需要输入一次即可。如果太久没有使用sudo(一般为5分钟),则再次使用需要再次输入口令。
如果系统在刚刚安装好后,没有做任何 sudo 配置,则执行 sudo 将抛出如下错误提示:
[snow@localhost ~]$ sudo ls 我们信任您已经从系统管理员那里了解了日常注意事项。 总结起来无外乎这三点: #1) 尊重别人的隐私。 #2) 输入前要先考虑(后果和风险)。 #3) 权力越大,责任越大。 [sudo] snow 的密码: snow 不在 sudoers 文件中。此事将被报告。
在使用 sudo 之前,管理员通过配置 /etc/sudoers 指定用户可以执行的特权命令,下面是 CentOS7 的 sudoers 文件的默认值。
[root@localhost snow]# cat /etc/sudoers ## 省略了 ## Allow root to run any commands anywhere root ALL=(ALL) ALL ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
下面以“root ALL=(ALL) ALL”配置为例,这段配置指定 root 用户可以使用 sudo 在任何机器上(第1个 ALL)以任何用户身份(第2个 ALL)执行任何命令(第3个 ALL)。最后一行用“%wheel”替代了所有属于 wheel 用户组的用户。如下图:
下面来看一段稍微复杂的配置,该配置涉及 3 个用户,并为他们设置了不同的权限:
Host_Alias STATION = web1, web2, databank Cmnd_Alias DUMP = /sbin/dump, /sbin/restore lewis STATION = ALL mike ALL = (ALL) ALL john ALL = (operator) DUMP
上面配置开头两行使用关键字 Host_Alias 和 Cmnd_Alias 分别定义了主机组和命令组。在配置文件后面,可以使用 STATION 替代主机 web1、web2 和 databank;用 DUMP 替代命令 /sbin/dump 和 /sbin/restore。
上面配置的最后三行配置了用户的权限。详细说明如下:
“lewis STATION = ALL”行设置 lewis 可以在 STATION 组的计算机上(web1, web2, databank)执行任何命令。由于在等号“=”后面没有使用小括号“()”指定用户,因此 lewis 将以 root 身份执行这些命令。
“mike ALL = (ALL) ALL”行设置 mike 用户在所有的计算机上可以运行任何命令。由于小括号“()”中的用户列表使用了关键字 ALL,因此 mike 可以用 sudo 以任何用户身份执行命令。sudo 命令可以使用 -u 选项改变用户身份。例如:sudo -u snow touch new_file
“john ALL = (operator) DUMP”行设置 john 可以在所有主机上执行 /sbin/dump 和 /sbin/restore 两个命令(必须以 operator 的身份执行)。为此,john 必须像下面这样使用 dump 命令。例如:sudo -u operator /sbin/dump backup /dev/sdb1