sudo
是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root
命令的一个工具,如halt,reboot,su等等。换句话说通过此命令可以让非root
的用户运行只有root
才有权限执行的命令。
sudo
是新手接触 Linux 系统需要掌握的基本命令。学会使用 sudo
可以帮助我们养成良好习惯,避免平时用 root 管理员帐号所带来的潜在风险,同时方便在共享机器时可以控制用户权限。本文以新手视角简明介绍 sudo
基础用法和常用配置。
sudo 简介
sudo
是 Linux 和其它类 Unix 操作系统下的权限授予管理程序。它允许已授权用户(或用户组)在需要时以 root 或其它用户权限运行命令,并且具有灵活可扩展和能够审查用户活动的特性。
以下是 sudo
和另一个提权命令 su
之间的主要区别。
su 命令 | sudo 命令 |
---|---|
需要使用 root 密码验证 | 验证用户密码而无需 root 密码 |
切换到 root 不能控制权限 | 通过命令提权而非切换 root shell,可控制权限 |
切换到 root 后需主动退出 | 临时授权机制,超过时间需重新验证 |
难以审查用户活动记录 | 记录用户活动日志,可创建自定义警报 |
sudo 安装
sudo
通常作为基础软件被内置安装在系统中,可以用下面命令检查和安装 sudo
。
检查是否已安装 sudo | 安装 sudo | |
---|---|---|
RHEL & CentOS | rpm -q sudo |
yum -y install sudo |
Debian & Ubuntu | dpkg -s sudo |
apt-get -y install sudo |
创建用户帐号
如果你正在使用 root 没有其它用户帐号,那么需要先创建一个普通用户帐户。
useradd 用户名 && passwd 用户名
运行命令后会先创建用户帐号,然后按提示设置密码(输入两遍)。
开始使用 sudo
sudo
有个默认用户组,组内用户可以通过 sudo
运行所有命令。如果用户帐号是自己使用的,或者希望拥有运行特权命令的能力,那么将用户添加到该组里就可以使用 sudo
了。
在主流 Linux 发行版中,这个默认用户组名称不尽相同,可以搜索 sudo
配置文件查询。
例如下面是 CentOS 搜索结果,默认用户组是 wheel
(Ubuntu & Debian 则是 sudo
用户组)。
[[email protected] ~]# grep ^% /etc/sudoers %wheel ALL=(ALL) ALL
注:如果搜索没有匹配结果,可能配置文件注释掉了用户组参数,需要手动去除注释。
下面是添加用户到对应用户组的命令。
# RHEL & CentOS usermod -aG wheel 用户名 # Debian & Ubuntu usermod -aG sudo 用户名
添加后就可以通过 sudo
提权运行命令了。使用方法很简单,在命令前加上 sudo
再运行即可(运行前会要求验证用户密码)。下面是一个使用示例,未加 sudo
前无权限查看 root 用户目录文件。
[[email protected] ~]$ ls -a /root ls: cannot open directory /root: Permission denied [[email protected] ~]$ sudo ls -a /root [sudo] password for anthony: . .. .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
sudo 常用参数
用 sudo -h
命令可以打印详细参数列表。下面介绍几个经常用到参数。
命令参数 | 功能作用 |
---|---|
sudo -l |
查询当前用户拥有的权限,可以运行哪些命令 |
sudo -u 用户名 命令 |
以指定用户身份运行命令(如不指定,预设用户身份是 root) |
sudo -u 用户名 -H 命令 |
将 HOME 环境变量设为指定用户的 HOME 环境变量 |
sudo -E 命令 |
运行命令时保留当前用户的环境变量 |
sudo -k |
清除密码缓存时间,下次使用 sudo 需重新验证用户密码 |
sudo -v |
延长密码缓存时间 5 分钟 |
sudo 使用技巧
使用 Shell 内置命令
对于 Shell 内置命令,无法通过 sudo
运行。解決方法是切换到 root shell 再运行。
sudo bash
传递用户命令别名
sudo
会忽略当前用户设置的命令别名,解決方法是在 ~/.bashrc
文件中添加一个 sudo
别名。别名值最后加一个空格,这样 bash 会检查空格后面的命令是否也是别名。
alias sudo='sudo '
快速运行之前命令
新手经常会遇到的问题,不熟悉 Linux 系统操作权限,往往运行命令后提示权限不够才想起要用 sudo
。每次这样重新输入命令很麻烦,下面用法会省事的多。
# 运行上一个命令 sudo !! # 运行历史记录里第 3 个命令 sudo !3
一次运行多个命令
sudo
运行多个命令需要用到 -c
参数,在引号间用 ;
隔开命令。
sudo -- bash -c 'whoami; hostname; date'
sudo 常用配置
sudo
默认安全策略由 /etc/sudoers
配置文件提供,它具有高度可扩展性。譬如设置允许哪些用户(或用户组)使用 sudo
,限制只可用哪些命令,是否需要密码验证等,这些都需修改配置文件实现。
注:为避免语法问题,编辑 /etc/sudoers
文件要用下面命令打开。它默认调用 vi
编辑器,会在保存前检查语法是否正确(如果有错误,输入 e
回车返回编辑,或输入 x
不保存退出)。
sudo visudo
介绍几个常用 sudo
配置项,将参数添加到配置文件里使用。如果存在多个相同参数设置,则后面的会覆盖前面的生效。
添加用户或用户组,并控制权限
# 添加 anthony 用户 anthony ALL=(ALL) ALL # 添加 marilyn 用户组 %marilyn ALL=(ALL) ALL
上面示例添加的用户可以通过 sudo
运行所有命令,相当拥有 root 权限。参数解析如下:
- 第一列信息表示用户或用户组,用户组前面带 % 字符区分;
- 第二列 ALL 表示允许所有主机名登录的用户执行命令,括号里 ALL 允许以任何用户身份执行命令;
- 第三列 ALL 表示允许所有命令。
而下面这个是带权限控制的用户添加,它只允许 joseph 用户在 mylaptop 主机名的机器上以 root 身份运行 ls
和 kill
命令。
joseph mylaptop=(root) /bin/ls,/bin/kill
设置重新验证密码时间
用户使用 sudo
后的 5 分钟内再次使用可以免于密码验证,时间支持自定义设置。
Defaults:用户名 timestamp_timeout=20
例如设置 20 分钟。如果设置为 0,则每次使用 sudo
都需要密码验证。如果设置负数(即小于 0),那么直至下次系统重启前都不用重新验证密码。
对指定用户或命令免密码验证
# 对 anthony 用户免密码 anthony ALL=(ALL) NOPASSWD: ALL # 对 anthony 用户运行 ls 、kill 命令免密码 anthony ALL=(ALL) NOPASSWD: /bin/ls,/bin/kill
注:当对用户设置免密码验证,那些以该用户身份运行的程序也可以无需密码执行 sudo
。