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