1

我想创建一个我将在管理员帐户中运行的 bash 脚本。我希望脚本将现有的主机文件备份到文件扩展名为 .original 的同一目录中,然后我希望脚本将 3 个预定义条目(在脚本正文中指定)添加到主机文件中并保持现有格式主机文件。如何在无需用户进行身份验证的情况下完成此操作 - 我希望将管理员密码存储在脚本中,并在每次请求升级时传递给 sudo。谢谢你。

4

3 回答 3

1

您不应该将密码存储在脚本中。那是一个安全漏洞。您可以通过使用 setuid 位来实现您想要的行为,而无需将密码存储在任何地方。

首先运行chmod u+s myscript以使其以所有者身份运行(当您将所有者设为 root 时,这将使您的脚本以 root 身份运行,因此您根本不需要在脚本中使用 sudo)。

然后确保您想要的任何人都可以执行该脚本。如果您希望所有用户都能够运行chmod +x myscript. 如果您只希望自己能够确保您是该组中的唯一用户并chmod g+x myscript改为使用。

然后运行sudo chown root myscript使其归root所有。

现在,只要有权执行该脚本的任何人运行它,它将以 root 身份执行,无论该用户是否是管理员。

于 2012-05-05T18:16:27.300 回答
1

您必须编写一个程序(编译代码)和 suid root 来执行该操作,然后您不必向用户透露 root 密码。我还没有遇到允许您使用脚本的系统。或者你必须 suid bash 本身这是实际的程序,然后每个人都可以是 root。

示例:(以 root 身份运行)

ex qq.c << EOF
1,\$d
i
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
int main() {
    assert(0 == setreuid(geteuid(),-1));
    return system(
    "/bin/bash << DONE\n"
    "if [ \"\$UID\" != '0' ];then echo \"need to be root to do this\";exit 16;fi;\n"
    "cp /etc/hosts /etc/hosts.org\n"
    "echo 127.0.0.1 banned1.domain >> /etc/hosts\n"
    "echo 127.0.0.1 banned2.domain >> /etc/hosts\n"
    "echo 127.0.0.1 banned3.domain >> /etc/hosts\n"
    "DONE\n");
}
.
x
EOF
gcc -o qq qq.c && chmod u+s qq
于 2012-05-06T03:09:08.860 回答
0

您可以通过sudo命令执行此操作。该sudo命令允许您指定哪些用户可以运行哪些命令以及哪些用户。通常,您授予用户访问特定命令的权限,这些命令需要以 root 身份执行。例如,特定的人需要能够启动和停止 Apache httpd。通常,只允许 root 执行此操作,但您可以将此权限授予您的 Web 管理员,而无需授予该人以 root 身份执行任何其他操作的权限。

sudo命令由/private/etc/sudoers文件控制。(您应该使用visudo命令进行编辑)。

假设您创建了一个 shell 脚本来编辑您的/etc/hosts文件。你首先想把它放在一个特定的位置,比如说/usr/local/edit_hosts_file。这是一个很好的位置,因为该目录归根用户所有。

现在,您要确保只有 root 可以执行此文件,甚至可能只有 root 可以读取此文件,并且您特别要确保只有 root 可以编辑此文件。否则,人们可以使用此文件为自己授予对系统其他部分的 root 访问权限:

 $ sudo chown root:root /usr/share/edit_hosts_file
 $ sudo chmod 700 /usr/share/edit_hosts_file

现在,您的命令是安全的,您可以编辑该/private/etc/sudoers文件以仅允许特定用户以 root 身份运行此 shell 脚本:

User_Alias ALLOWED_USERS = bob, carol, ted, alice
Cmnd_Alias ETC_HOSTS_EDIT = /usr/share/bin/edit_hosts_file
Host_Alias MACHINE_LIST = localhost
ALLOWED_USERS    MACHINE_LIST=(ALL) NOPASSWD: ETC_HOSTS_EDIT

这将允许已定义ALLOWED用户列表中的任何用户运行您的etc/hosts编辑脚本,而无需密码。

现在,如果有人想运行您的脚本,他们可以在root不知道密码且无需提供密码的情况下执行此操作。这样,您的脚本可以由另一个脚本执行:

 $ sudo /usr/share/bin/edit_hosts_file
 Script completed: /etc/hosts edited
于 2012-05-06T05:00:05.677 回答