我想创建一个我将在管理员帐户中运行的 bash 脚本。我希望脚本将现有的主机文件备份到文件扩展名为 .original 的同一目录中,然后我希望脚本将 3 个预定义条目(在脚本正文中指定)添加到主机文件中并保持现有格式主机文件。如何在无需用户进行身份验证的情况下完成此操作 - 我希望将管理员密码存储在脚本中,并在每次请求升级时传递给 sudo。谢谢你。
3 回答
您不应该将密码存储在脚本中。那是一个安全漏洞。您可以通过使用 setuid 位来实现您想要的行为,而无需将密码存储在任何地方。
首先运行chmod u+s myscript
以使其以所有者身份运行(当您将所有者设为 root 时,这将使您的脚本以 root 身份运行,因此您根本不需要在脚本中使用 sudo)。
然后确保您想要的任何人都可以执行该脚本。如果您希望所有用户都能够运行chmod +x myscript
. 如果您只希望自己能够确保您是该组中的唯一用户并chmod g+x myscript
改为使用。
然后运行sudo chown root myscript
使其归root所有。
现在,只要有权执行该脚本的任何人运行它,它将以 root 身份执行,无论该用户是否是管理员。
您必须编写一个程序(编译代码)和 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
您可以通过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