sudo
命令的作用sudo
(全称 superuser do
)是 Linux/Unix 系统中权限管理的核心工具。
允许普通用户在授权下以其他用户(默认是 root
)的权限执行命令,而无需直接登录账户。
sudo
命令的典型使用场景sudo
覆盖了系统管理的几乎所有高权限操作场景,以下是常见示例:
sudo apt-get install nginx # Ubuntu/Debian系安装
sudo yum remove httpd # CentOS/RHEL系卸载
sudo systemctl start nginx # 启动Nginx服务
sudo systemctl restart mysql # 重启MySQL服务
sudo nano /etc/nginx/nginx.conf # 编辑Nginx主配置文件
sudo adduser newuser # 添加新用户
sudo passwd olduser # 修改指定用户密码
sudo
命令的选项sudo
除了无选项以root用户执行指令的操作,还支持许多其他的选项,可灵活控制执行环境、目标用户等。
以下是常用选项的介绍:
-u <用户>
:指定目标用户通过 -u
选项可指定其他目标用户。
示例:
# 以 `www-data` 用户身份查看 Nginx 日志(需 `sudoers` 授权)
sudo -u www-data cat /var/log/nginx/access.log
-i
(--login
):模拟目标用户的登录环境-i
(--login
):模拟目标用户的登录环境,加载其完整的登录配置文件(如 ~/.bash_profile、~/.profile
),并切换到目标用户的家目录。
示例:
# 以 root 身份模拟登录环境(需输入当前用户密码)
sudo -i
效果等同于
su - 目标用户
后执行命令,关于su
命令看这篇文章:Linux_su命令
-s
(--shell
):启动目标用户的 shell-s
(--shell
):启动目标用户的非登录交互式 shell,仅加载非登录配置文件(如 ~/.bashrc
),保持原用户的当前工作目录。
示例:
# 以 root 身份启动 shell(需输入当前用户密码)
sudo -s
-l
(--list
):查看当前用户的 sudo 权限-l
可列出当前用户被允许执行的 sudo
命令(需输入密码验证身份)。
示例:
user@host:~$ sudo -l
Matching Defaults entries for user on host:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User user may run the following commands on host:
(ALL : ALL) ALL # 允许以所有用户执行所有命令
-k
(--reset-timestamp
):重置密码缓存sudo
默认会缓存用户密码(通常 15 分钟),期间无需重复输入。-k
强制清除缓存,下次使用 sudo
需重新输入密码。
示例:
sudo -k # 清除当前用户的 sudo 密码缓存
sudo
的核心是 基于用户/组的权限授权,所有权限规则存储在 /etc/sudoers
文件中。
其工作流程如下:
sudo 命令
;/etc/sudoers
,确认当前用户是否有权限以目标用户(默认 root
)执行该命令;/var/log/auth.log
)。/etc/sudoers
sudoers
必须通过 visudo
命令编辑,可以自动检查语法错误,避免文件损坏导致无法使用 sudo
.
sudoers
中最核心的部分是权限规则,格式为:
用户/用户组 主机=(目标用户:目标组) 允许执行的命令
示例1:
root ALL=(ALL:ALL) ALL
表示root用户可以在任何主机上以任何用户和任何组的身份执行任何命令。
示例2:
%sudo ALL=(ALL:ALL) ALL
%
符号:表示 “用户组”(Group),而非单个用户。
这条配置表示“sudo组的成员“可以在 任何主机上 以任何用户和任何组的身份执行任何命令。
sudo组 是Ubuntu等系统的默认特权组,普通用户加入此组后即可通过 sudo 执行高权限命令。
/etc/sudoers.d/
下图截取自/etc/sudoers
,可以看到,不建议直接修改该文件,可以将自定义配置的内容放在/etc/sudoers.d/
目录下,并且使用了@includedir
去包含了这个目录。