我想创建一个bash脚本,我将在管理员帐户内运行。我希望脚本将现有主机文件备份到具有文件扩展名.original的同一目录中,然后我希望脚本将3个预定义条目(在脚本主体中指定)添加到主机文件中,并维护现有格式主机文件。如何在用户不需要认证的情况下完成此任务 - 我希望管理员密码存储在脚本中,并在每次请求升级时将其传递给sudo。谢谢。将条目添加到主机文件
回答
您不应将密码存储在脚本中。这是一个安全漏洞。您可以通过使用setuid位实现您想要的行为,而无需在任何地方存储密码。
首先运行chmod u+s myscript
以使其作为所有者运行(当您创建所有者root时,这将使您的脚本以root身份运行,因此您不需要在脚本中使用sudo)。
然后确保任何你想要的人都可以执行脚本。如果您希望所有用户都能够运行chmod +x myscript
。如果您只希望自己能够确保您是该组中唯一的用户,并使用chmod g+x myscript
代替。然后运行sudo chown root myscript
使其拥有根。
现在任何有权执行该脚本的人都会运行它,它将以root用户身份执行,无论该用户是否是管理员。
你必须编写一个程序(编译代码)和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
您可以通过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
- 1. 根据事实将条目添加到主机文件
- 2. 添加主机到主机文件
- 3. 将主机添加到Ansible主机文件
- 4. Windows批处理添加/替换主机文件中的条目
- 5. Ansible add_host未添加到主机文件
- 6. 将条目添加到NSMutableDictionary
- 7. 批处理文件添加/删除主机文件条目语法错误
- 8. webpack添加从懒加载条目进口到主条目
- 9. MSMQ与主机文件条目
- 10. 如何将主机中用户主目录中的文件复制/添加到容器的主目录?
- 11. 如何将先决条件文件(.prq)添加到InstallShield项目?
- 12. 有条件地将文件添加到C++项目中的库
- 13. MSBuild将文件添加到主输出
- 14. 将映射添加到主机文件并且无法保存
- 15. 使用python将短主机名添加到/ etc/hosts文件中
- 16. 如何使用ansible将主机添加到known_host文件?
- 17. 将主机名添加到日志文件
- 18. 将.jar文件添加到React本机
- 19. 将文件添加到Installshield机柜中
- 20. 如何将主机添加到Icinga2?
- 21. 将0添加到主机名
- 22. 将另一个条目添加到.json文件。 NodeJS
- 23. 将条目添加到Linux内核.config文件
- 24. 将时间戳记添加到资源文件条目
- 25. 将新条目添加到现有主键时出错sybase
- 26. 将主机的IP地址添加到主机。allow
- 27. 未能将主机添加到已知主机列表
- 28. Eclipse PDT将项目名称添加到虚拟主机路径
- 29. 如何通过代码将目录添加到Web主机?
- 30. 如何将项目的根添加到本地主机路径
请问,如果我想在脚本中存储一个USB拇指驱动器,并把它从机器到机器直接从U盘上运行它这项工作。 –
@ DeanA.Vassallo不,它不会在这种情况下工作。如果Unix和/或OSX让你这样做,这将是一个巨大的安全漏洞。您可以使用存储在拇指驱动器上的10个字符的脚本完全控制任何人的操作系统。 – Paulpro
是的,这就是我的想法。这是一种一次性的情况。我可能只需要创建一个hosts文件的修改版本,其存储在U盘上,然后转到机器到机器,只需使用CP创建副本,然后CP再次将文件从拇指驱动器移动到/等 –