在脚本中使用 sudo 而不使用密码

2024-10-29 08:35:00
admin
原创
58
摘要:问题描述:出于某种原因,作为用户,我需要在不使用 sudo 的情况下运行脚本 script.sh,而该脚本需要 root 权限才能运行。 我认为唯一的解决方案是将 sudo 放在 script.sh 内部。让我们举个例子:script.sh : #!/bin/sh sudo apt-get update ...

问题描述:

出于某种原因,作为用户,我需要在不使用 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 下,就是这样

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用