在脚本中使用 sudo 而不使用密码
- 2024-10-29 08:35:00
- admin 原创
- 58
问题描述:
出于某种原因,作为用户,我需要在不使用 sudo 的情况下运行脚本 script.sh,而该脚本需要 root 权限才能运行。
我认为唯一的解决方案是将 sudo 放在 script.sh 内部。让我们举个例子:
script.sh :
#!/bin/sh
sudo apt-get update
当然,如果我执行此脚本,我会收到一个提示,要求我输入密码。然后我将以下内容添加到我的 sudoers 文件中(最后覆盖其他所有内容):
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
顺便说一句,我也尝试过这一行:
user ALL=(ALL) NOPASSWD:/path/to/script.sh
(我想我没有完全理解其中的区别)
但是,如果我不使用 sudo 执行此脚本,这并不能解决我的问题:
# ./script.sh
[sudo] password for user:
# sudo ./script.sh
Starts updating...
好吧,我对自己说:“好吧,这意味着如果我有一个在 sudoers 中引用的文件,就像我之前做的那样,只有当我用 sudo 调用它时,它才会在没有提示的情况下工作,这不是我想要的”。
所以,好的,我创建了另一个脚本 script2.sh,如下所示:
script2.sh
#!/bin/sh
sudo /path/to/script.sh
事实上,它是有效的。但我对这个解决方案并不满意,尤其是因为每个命令我都必须使用 2 个脚本。
这篇文章是为了帮助遇到这个问题并寻找相同解决方案的人(我没有找到很好的帖子),也许你们能提供更好的解决方案。
请随意分享您的想法!
编辑1:
我想强调的是,这个“apt-get update”只是一个例子,与我的脚本的实际内容相去甚远。我的脚本有很多命令(包括一些 cd 到 root-access-only 配置文件),解决方案不能是“好吧,直接用 apt-get 来做”。
例子的原则是为了帮助理解,而不是成为简化一般问题答案的借口。
解决方案 1:
摘自我的博客:IDMRockstar.com:
问题是,有时我需要以 root 身份运行命令。以下是我在不泄露密码的情况下快速完成此操作的简单方法:
#! /bin/bash
read -s -p "Enter Password for sudo: " sudoPW
echo $sudoPW | sudo -S yum update
这样,系统会提示用户输入密码(并从终端隐藏),然后根据需要传递到命令中,因此我不会以 root 身份运行整个脚本 =)
如果你有更好的方法,我很乐意听听!我绝对不是 shell 脚本专家。
解决方案 2:
如果您想sudo /usr/bin/apt-get update
在没有密码的情况下运行,您需要有 sudoers 条目:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
其中user
应替换为用户的名称或 ID。(在更复杂的情况下,user
可以用组或别名替换。man sudoers
详情请参阅。)
对于整个剧本的更大问题,有两种可能的方法:
方法 1
对于脚本中需要的每个命令sudo
,在 中专门为该命令创建一行sudoers
。在这种情况下,可以正常调用该脚本:
./script1.sh
方法 2
将一行放入sudoers
整个脚本中。完成此操作后,单个命令不需要sudo
。但是,sudo
必须使用来启动脚本,如下所示:
sudo ./script.sh
解决方案 3:
如果您不想将密码设置得非常安全(可能是公司里的一些测试服务器等等),您可以通过 echo 在脚本中提升为 sudo,如下所示:
echo YourPasswordHere | sudo -S Command
不过,提示仍然会打印“输入密码”文本以进行输出。所以不要指望它会很整洁。
请参阅此Askubuntu 帖子
解决方案 4:
正如您注意到的,必须出现在 sudoers 配置中的文件是由 启动的文件sudo
,而不是运行 的文件sudo
。
话虽如此,我们经常做的是
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
在sudo
配置中,script.sh
有脚本必须执行的所有命令。
然后我们定义一个 Bash 函数或别名,这样script.sh
实际上
sudo /path/to/script.sh
唯一的问题是,如果某些命令不能以 root 身份运行,则需要su - user -c "command"
在脚本中插入一些命令。
解决方案 5:
在新的 /etc/sudoers.d/apt-get 文件中,输入一行:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
这里需要可执行文件的完整限定路径。
然后在脚本中使用以下内容:
sudo apt-get update
这里不需要指定完整的名称。Sudo 使用 PATH 环境变量进行可执行文件解析。
在更改和检查 sudoers 配置时,请确保保持另一个 root 会话打开以便进行错误恢复。
解决方案 6:
我建议您查看 sudo 环境变量 - 具体来说,您可以使用(并检查)$SUDO_USER。使用 sudo 调用您的脚本(sudoers 中有 1 个条目),然后以 SUDO_USER 的身份执行用户操作,以 root 的身份执行 root 操作。
解决方案 7:
正如 Basilevs 所说,您需要将您的用户添加到sudoers
文件中,以避免sudo
脚本中的命令因等待密码而卡住。
在 Ubuntu 16 上,有一种更简单的方法:只需将用户添加到sudo group
,如下所示:
sudo usermod -aG sudo *username*
从那时起,它就会像魔法一样发挥作用。
笔记:
这仅在文件中存在以下行的情况下才有效/etc/sudoers
:
%sudo ALL=NOPASSWD: ALL
(此行在组级别授予无密码 sudo 权限,在本例中为sudo
组)
(如果没有此行而您想添加它,请确保使用visudo
)
解决方案 8:
简单地说,为了以 root 身份执行命令,您必须使用 su(即使 sudo 也使用 su)只要您成功执行 sudo ./script2.sh,就可以改为:sudo su "#" //commands as root here "#" exit //commands as use here您可以使用名为 sudo 的 shell 函数,但我认为没有其他更好的方法,但是脚本 inti、rc android ..etc 的情况就是如此,必须整洁 ;)
然而这需要你输入 NOPASSWD: su ,这确实是完全安全的
无论如何,这里缺少 POISX 权限原则,即过滤,因此不要向所有用户启用某些功能,反之亦然,只需根据需要多次调用 sudo 即可,无需其他任何操作:
chown root script.sh
chmod 0755 script.sh
chgrp sudo script.sh
“让 .sh 成为 root 所有者”,“让其成为只读,并为其他人执行”,“并将其放入 sudo 组中”,当然是在 sudo 下,就是这样
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件