允许普通用户在 Linux / UNIX 操作系统下以 root 身份运行命令
来自我的邮箱:
我想以 root 用户身份运行一些命令,例如停止或启动 Web 服务器。如何允许普通用户以 root 身份运行这些命令?
您需要使用 sudo 命令,该命令用于以其他用户身份执行命令。它允许获准用户以超级用户或其他用户身份执行命令,如 /etc/sudoers(定义或列出谁可以运行什么的配置文件)文件中所指定。sudo 命令允许用户以其他用户身份在 Linux 系统上执行任务。
sudo 命令
sudo 比 su 命令更安全。默认情况下,它会将 sudo 的使用情况、命令和参数记录在/var/log/secure(Red Hat/Fedora / CentOS Linux)或/var/log/auth.log(Ubuntu / Debian Linux)中。
如果调用用户是 root 或者目标用户与调用用户相同,则无需密码。否则,默认情况下 sudo 要求用户使用密码进行身份验证。用户通过身份验证后,会更新时间戳,然后用户可以在短时间内(15 分钟,除非在 sudoers 中覆盖)无需密码即可使用 sudo。
/etc/sudoers 语法
以下是 /etc/sudoers 文件使用的一般语法:
USER HOSTNAME=COMMAND
其中,
- USER:普通用户的名称
- HOSTNAME:允许运行命令的位置。这是适用此规则的系统的主机名。sudo 的设计使您可以在所有系统上使用一个 sudoers 文件。此空间允许您设置每个主机的规则。
- COMMAND:简单的文件名允许用户使用任何他/她想要的参数来运行命令。但是,您也可以指定命令行参数(包括通配符)。或者,您可以指定“”来表示该命令只能在没有命令行参数的情况下运行。
如何使用 sudo?
授予用户 rokcy 访问 halt/shutdown 命令的权限并重新启动 Apache Web 服务器。首先,以 root 用户身份登录。使用 visudo 命令编辑配置文件:将以
# visudo
下行附加到文件:
保存并关闭文件。现在 rokcy 用户可以通过键入以下命令重新启动 Apache Web 服务器:
输出:
rokcy localhost=/sbin/halt
rokcy dbserver=/etc/init.d/apache-perl restart
$ sudo /etc/init.d/apache-perl restart
Password: Restarting apache-perl 1.3 web server....
sudo 命令已将尝试记录到日志文件 /var/log/secure 或 /var/log/auth.log 文件中:
# tail -f /var/log/auth.log
示例输出:
May 13 08:37:43 debian sudo: rokcy : TTY=pts/4 ; PWD=/home/rokcy ; USER=root ; COMMAND=/etc/init.d/apache-perl restart
如果 rokcy 想要关闭计算机,他需要输入命令:
$ sudo /sbin/halt
输出:
Password:
在使用 sudo 运行命令之前,用户通常会提供密码。一旦通过身份验证,并且 /etc/sudoers 配置文件允许用户访问,则运行命令。sudo 会记录每个命令的运行。
示例
a) 允许 jadmin 运行各种命令:
jadmin ALL=/sbin/halt, /bin/kill, /etc/init.d/httpd
b) 允许用户 jadmin 无需任何密码(即以 root 身份)运行 /sbin/halt,无需进行身份验证:
jadmin ALL= NOPASSWD: /sbin/halt
c) 允许用户 charvi 从系统 dev02 上的 /usr/bin 目录运行任何命令:
charvi dev02 = /usr/bin/*
参见:
- FreeBSD > 成为超级用户 (su) 或为用户启用 su 访问权限
- 阅读 sudo 和 sudoers 的手册页
- sudo 项目主页
已更新以确保准确性。