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

2024-10-29 08:35:00
admin
原创
332
摘要:问题描述:出于某种原因,作为用户,我需要在不使用 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 下,就是这样

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用