2012-05-05 89 views
1

我想创建一个bash脚本,我将在管理员帐户内运行。我希望脚本将现有主机文件备份到具有文件扩展名.original的同一目录中,然后我希望脚本将3个预定义条目(在脚本主体中指定)添加到主机文件中,并维护现有格式主机文件。如何在用户不需要认证的情况下完成此任务 - 我希望管理员密码存储在脚本中,并在每次请求升级时将其传递给sudo。谢谢。将条目添加到主机文件

回答

1

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

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

然后确保任何你想要的人都可以执行脚本。如果您希望所有用户都能够运行chmod +x myscript。如果您只希望自己能够确保您是该组中唯一的用户,并使用chmod g+x myscript代替。然后运行sudo chown root myscript使其拥有根。

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

+0

请问,如果我想在脚本中存储一个USB拇指驱动器,并把它从机器到机器直接从U盘上运行它这项工作。 –

+0

@ DeanA.Vassallo不,它不会在这种情况下工作。如果Unix和/或OSX让你这样做,这将是一个巨大的安全漏洞。您可以使用存储在拇指驱动器上的10个字符的脚本完全控制任何人的操作系统。 – Paulpro

+0

是的,这就是我的想法。这是一种一次性的情况。我可能只需要创建一个hosts文件的修改版本,其存储在U盘上,然后转到机器到机器,只需使用CP创建副本,然后CP再次将文件从拇指驱动器移动到/等 –

1

你必须编写一个程序(编译代码)和suid root来执行它,那么你不必向用户透露root密码。我还没有遇到一个允许你使用脚本的系统。或者你必须让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 
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文件,只允许特定用户运行这个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 
相关问题