执行sudo命令时,要求用户查找密码。
可以通过编辑/ etc / sudoers配置文件更改sudo命令的此默认bahaviouv。
如果我们不想要求密码,请通过更改行更改/ etc / sudoers文件:
jack ALL=(root) /usr/local/bin/sudo_test.sh
和
jack ALL=(root) NOPASSWD:/usr/local/bin/sudo_test.sh
注意有关sudo命令及其功能的更多要学习。
发现更多关于sudo命令的好方法是首先:
man sudo
或者访问sudoers配置文件的手册页
man sudoers
让我们创建一些简单的bash脚本,它将为我们提供sudo命令的基本测试环境。
以下Linux命令将在/ 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文件,然后尝试使用名为“jack”的另一个用户执行相同的脚本。
注意LS -L命令执行后的脚本的权限。
$ whoami jack $ 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 jack 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 jack jack 0 2010-08-29 17:36 /tmp/sudo_file.tmp
如我们所见,jack用户执行脚本,此过程的所有者也是用户jack。
在/ tmp /目录中创建的文件也由jack用户拥有。
在继续之前,请删除/tmp/sudo_file.tmp文件。
首先,我们需要确保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文件的权限。
只有属于根组的用户root和用户才能读取此文件。
$ cat /etc/sudoers cat: /etc/sudoers: Permission denied
如果在执行上述命令时出现一些问题,则可能在系统上安装sudo的机会。
如果我们正在运行Ubuntu,Fedora或者OpenSuse,则这是不太可能的,因为默认情况下在系统上安装了sudo实用程序。
如果我们正在运行Debian执行以下Linux命令以安装sudo实用程序:
注意:由于大多数体面的Linux发行版都有默认情况下安装了Sudo实用程序,因此系统不太可能安装Sudo实用程序。
# apt-get install sudo
对于yum(rpm)分发,请使用此命令安装sudo:
# yum install sudo
sudo之前的分钟数将要求用户再次输入密码是默认为15.可以通过在/ etc / sudoers文件中指定sudo的时间戳_timeout指令来更改此行为。
要将sudo密码超时增加到60分钟,我们通过更改一行将时间戳_timeoutsudo指令添加到/ etc / sudoers文件中:
Defaults env_reset
到
Defaults env_reset , timestamp_timeout=60
我们的下一个任务现在是使jack用户能够以root权限和root权限执行/usr/local/bin/sudo_test.sh脚本,而不会放弃root凭据。
为此,我们需要编辑sudo配置文件/ etc / sudoers。
由于root只读了对sudo配置文件/ etc / sudoers的访问,我们不想更改它,我们将使用visudo命令作为root执行,以将以下行添加到此文件中:
jack ALL=(root) /usr/local/bin/sudo_test.sh
- jack:将有权执行/usr/local/bin/sudo_test.sh脚本的用户
- all:匹配任何内容,在此上下文中适用于主机名
- (root):此命令将使用root权限运行
- /usr/local/bin/sudo_test.sh:实际命令
结果,当我们现在尝试将/usr/local/bin/sudo_test.sh脚本执行为jack用户使用sudo命令并输入jack的密码:
$ rm /tmp/sudo_file.tmp $ sudo /usr/local/bin/sudo_test.sh [sudo] password for jack: 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用户。
此外,如果我们例如希望用户jack将脚本/ usr/local/bin/sudo_test.sh作为用户j“John”只使用Visudo替换/ etc / sudoers配置文件并用(john)替换(root)命令。
如果我们希望一个用户在不交换密码的情况下将命令作为另一个系统用户运行命令,那么例如,我们可能希望用户John运行查找命令或者自定义Bash shell脚本作为用户格雷格,甚至是没有密码交换的用户root(超级用户)。
在这种情况下,sudo实用程序与其/ etc / sudoers配置文件将是朋友。
这种实用程序非常广泛使用,但在所有级别的Linux用户的同时也很少理解。
这篇简短的文章介绍了sudoers配置文件的一些基本的sudo使用和格式。