如果您希望一个用户以另一个系统用户的身份运行命令而不交换密码,该怎么办?例如,您可能希望用户john以greg用户或什至以root用户(superuser)身份运行find命令或自定义bash shell脚本,而无需进行密码交换。在这种情况下,带有/etc /sudoers配置文件的sudo实用程序将是您的朋友。该实用程序使用非常广泛,但同时各个级别的Linux用户对它的了解却很少。
这篇简短的文章介绍了sudo用法的一些基本知识以及sudoers配置文件的格式。
须藤安装
首先,我们需要确保sudo和/etc /sudoers sudo配置文件可用。为此,请执行以下操作:
$ which sudo
要么
$ sudo -V
第一个命令应显示sudo二进制可执行文件的位置,第二个程序将输出sudo命令本身的版本号。 sudo配置文件sudoers在大多数情况下位于/etc /sudoers中。您可以使用ls命令找到该文件。
$ ls -l /etc/sudoers -r--r----- 1 root root 481 2010-04-08 21:43 /etc/sudoers
注意/etc /sudoers文件的默认和”must be”权限。只有用户root和属于根组的用户才能读取此文件。
$ cat /etc/sudoers
cat: /etc/sudoers: Permission denied
如果执行上述命令时遇到问题,则可能是您的系统上未安装sudo。如果您正在运行Ubuntu,Fedora或OpenSuSE,并且默认情况下将sudo实用程序安装在系统上,则这是不太可能的。如果您正在运行Debian,请执行以下命令linux命令安装sudo实用程序:
注意:您的系统上未安装sudo实用程序的可能性很小,因为大多数体面的Linux发行版都默认安装了sudo实用程序。
# apt-get install sudo
对于yum(RPM)发行版,请使用以下命令来安装sudo:
# yum install sudo
(adsbygoogle = window.adsbygoogle || [])。push({});
使用sudo执行bash脚本
让我们创建一些简单的bash脚本,它将为我们提供sudo命令的基本测试环境。下列linux命令s将在/usr /local /bin目录中创建名为sudo_test.sh的bash脚本并将其可执行:
$ su -
Password:
# cd /usr/local/bin/
# echo "ps aux | grep $$" > sudo_test.sh
# echo "touch /tmp/sudo_file.tmp" >> sudo_test.sh
# chmod +x sudo_test.sh
该脚本将不执行任何操作,除了它将打印sudo_test.sh bash脚本的进程ID及其相关所有者ID作为STDOUT输出,同时还将在/tmp /目录中创建一个名为sudo_file.tmp的文件。现在,我们以root用户身份执行此脚本,并检查该进程的所有者。
./sudo_test.sh
[1] 3513
/usr/local/bin# ps aux | grep 3513
root 3513 0.0 0.1 4260 908 pts/4 S 16:32 0:00 bash
root 3516 0.0 0.0 1700 268 pts/4 R+ 16:32 0:00 grep 3513
如您所见,进程ID 3513由用户root拥有。此外,通过执行ls命令,我们可以观察到/tmp/sudo_file.tmp文件是由root用户拥有的。
# ls -l /tmp/sudo_file.tmp
-rw-r--r-- 1 root root 0 2010-08-29 17:31 /tmp/sudo_file.tmp
让我们删除/tmp/sudo_file.tmp文件,并尝试与另一个名为”lilo”的用户执行相同的脚本。在执行ls -l命令后,请注意脚本的权限。
$ whoami
lilo
$ ls -l /usr/local/bin/sudo_test.sh
-rwxr-xr-x 1 root root 44 2010-08-29 17:31 /usr/local/bin/sudo_test.sh
$ /usr/local/bin/sudo_test.sh
root 3502 0.0 0.3 4260 1744 pts/4 S+ 16:31 0:00 bash
lilo 3773 0.0 0.1 3116 720 pts/5 R+ 17:36 0:00 grep 3502
$ ls -l /tmp/sudo_file.tmp
-rw-r--r-- 1 lilo lilo 0 2010-08-29 17:36 /tmp/sudo_file.tmp
如您所见,脚本是由lilo用户执行的,该进程的所有者也是lilo用户。在/tmp /目录中创建的文件也属于lilo用户。在继续之前,请删除/tmp/sudo_file.tmp文件。
向用户授予sudo权限
现在,我们的下一个任务是使lilo用户能够以root特权执行/usr/local/bin/sudo_test.sh脚本,而不会放弃root凭证。为此,我们需要编辑/etc /sudoers的sudo配置文件。由于root用户仅具有对sudo配置文件/etc /sudoers的只读访问权限,并且我们不想更改它,因此我们将使用以root用户身份执行的visudo命令向此文件添加以下行:
lilo ALL=(root) /usr/local/bin/sudo_test.sh
- lilo:有权执行/usr/local/bin/sudo_test.sh脚本的用户
- ALL:匹配任何内容,在这种情况下,它适用于主机名
- (root):此命令将以root特权运行
- /usr/local/bin/sudo_test.sh:实际命令
(adsbygoogle = window.adsbygoogle || [])。push({});
结果,当我们现在尝试使用sudo命令以lilo用户身份执行/usr/local/bin/sudo_test.sh脚本并输入lilo的密码时:
$ rm /tmp/sudo_file.tmp
$ sudo /usr/local/bin/sudo_test.sh
[sudo] password for lilo:
root 3502 0.0 0.3 4260 1744 pts/4 S 16:31 0:00 bash
root 3793 0.0 0.1 3116 720 pts/5 S+ 17:46 0:00 grep 3502
$ ls -l /tmp/sudo_file.tmp
-rw-r--r-- 1 root root 0 2010-08-29 17:46 /tmp/sudo_file.tmp
进程ID 3502由root拥有,/tmp /sudo_file.tmp的所有者是root用户。此外,例如,如果您希望用户lilo以用户j”john”的身份执行脚本/usr/local/bin/sudo_test.sh,只需更改/etc /sudoers配置文件,然后使用visudo命令将(root)替换为(john)。
没有密码的sudo
当执行sudo命令时,将要求用户输入密码。可以通过编辑/etc /sudoers配置文件来更改sudo命令的默认行为。如果我们不想被要求输入密码,我们可以通过更改以下行来更改/etc /sudoers文件:
lilo ALL=(root) /usr/local/bin/sudo_test.sh
与
lilo ALL=(root) NOPASSWD:/usr/local/bin/sudo_test.sh
sudo密码超时
默认情况下,sudo将要求用户再次输入密码的分钟数为15。可以通过在/etc /sudoers文件中指定sudo的timestamp_timeout指令来更改此行为。为了将sudo密码超时增加到60分钟,我们通过更改以下行将timestamp_timeout sudo指令添加到/etc /sudoers文件中:
Defaults env_reset
至
Defaults env_reset , timestamp_timeout=60
了解有关sudo的更多信息
注意,关于sudo命令及其功能还有很多要学习的地方。了解更多有关sudo命令的好方法是从以下内容开始:
man sudo
或访问sudoers配置文件的手册页
man sudoers