在脚本内使用没有密码的 sudo

Posted

技术标签:

【中文标题】在脚本内使用没有密码的 sudo【英文标题】:Use sudo without password INSIDE a script 【发布时间】:2014-10-02 15:33:08 【问题描述】:

出于某种原因,作为用户,我需要在没有 sudo 的情况下运行需要 root 权限才能工作的脚本 script.sh。 我认为这是将 sudo INSIDE 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 做”。

示例的原则是帮助理解,而不是作为简化一般问题答案的借口。

【问题讨论】:

NOPASSWD:/path/to/script.sh 表示您可以在没有密码的情况下使用sudo /path/to/script.sh。这并不意味着脚本可以在没有密码的情况下使用sudo @Barmar 这可能是一个答案 @hek2mgl 之后我注意到他在问题中已经有了类似的东西。 【参考方案1】:

来自我的博客:IDMRockstar.com:

问题在于,有时我需要以 root 身份运行命令。这是我在不泄露密码的情况下完成此操作的快速而肮脏的方法:

#! /bin/bash
read -s -p "Enter Password for sudo: " sudoPW
echo $sudoPW | sudo -S yum update

这样会提示用户输入密码(并从终端隐藏),然后根据需要传递给命令,因此我不会以 root 身份运行整个脚本 =)

如果你有更好的方法,我很想听听!无论如何,我都不是 shell 脚本专家。

干杯!

.: 亚当

【讨论】:

这个答案与一年前伊顿艾默里奇的答案非常相似,也许可以将read -s -p 部分添加到其中作为将密码存储在文件中的另一种方法。 请注意,Bourne 不支持读取 -s 选项,但仅支持 bash,因此不要通过在脚本前加上错误的 shebang 来混淆自己。【参考方案2】:

如果你想在没有密码的情况下运行sudo /usr/bin/apt-get update,你需要有sudoers入口:

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

对于整个脚本的较大问题,有两种可能的方法:

方法一

对于脚本中需要sudo 的每个命令,在sudoers 中专门为该命令创建一行。这种情况下,脚本可以正常调用:

./script1.sh

方法2

sudoers 中为整个脚本添加一行。完成后,各个命令就不需要sudo。但是,必须使用sudo 来启动脚本,如下所示:

sudo ./script.sh

【讨论】:

apt-get 就是一个例子。事实上,我的脚本有很多命令......我还不够笨,无法让脚本完全按照 apt-get 的方式进行操作! 我添加了行 user ALL=(ALL:ALL) NOPASSWD:/path-to-script 这似乎适用于该脚本中的 sudo sshfs ... 命令【参考方案3】:

如果您的密码不是您想要非常安全的东西,(可能是公司中的一些测试服务器等),您可以通过 echo 在脚本中提升为 sudo,例如:

echo YourPasswordHere | sudo -S Command

提示仍然会打印“输入密码”文本以输出。所以不要指望它整洁。

看到这个Askubuntu post

【讨论】:

【参考方案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】:

我建议您查看 sudo 环境变量 - 特别是您可以使用(并检查)$SUDO_USER。使用 sudo(sudoers 中的 1 个条目)调用您的脚本,然后以 SUDO_USER 身份执行用户内容,以 root 身份执行 root 内容。

【讨论】:

【参考方案6】:

在新的 /etc/sudoers.d/apt-get 文件中,放一行:

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

此处需要完整的可执行文件路径。

然后在您的脚本中使用以下内容:

sudo apt-get update

在这里,不需要完全指定的名称。 sudo 使用 PATH 环境变量来解析可执行文件。

在更改和检查 sudoers 配置时,请确保打开另一个根会话以进行错误恢复。

【讨论】:

您应该只使用visudo,而不是使用第二个根。这就是它的用途。此外,这种方法允许任何人在没有密码的情况下更新系统。【参考方案7】:

正如 Basilevs 所提到的,您需要将您的用户添加到 sudoers 文件中,以避免脚本中的 sudo 命令在等待密码时卡住。

在 Ubuntu 16 上,有一个更简单的方法:只需将用户添加到 sudo group,如下所示:

sudo usermod -aG sudo *username*

从那时起,它应该像魅力一样发挥作用。

注意:

这仅适用于以下行在文件/etc/sudoers 中的情况:

%sudo ALL=NOPASSWD: ALL

(该行在组级别提供无密码 sudo 权限,在本例中为 sudo 组)

(如果此行不存在并且您想添加它,请确保使用visudo

【讨论】:

仍然提示输入密码 这里有 2 个不同的东西在起作用:(1) 命令 'sudo usermod -aG sudo username' 将 sudo 权限授予用户 username。 (2) 但是,它本身并不为该用户提供 sudo 无密码权限。为此,/etc/sudoers 文件中必须存在以下行:'%sudo ALL=(ALL:ALL) ALL'(此行在组级别提供无密码权限)。这是我发帖的前提。我希望这可以澄清。 感谢您的澄清。如果您可以更新您的答案,它将解锁我的反对票,因此我可以将其变成赞成票:-)【参考方案8】:

简单地说,为了以 root 身份执行命令,您必须使用 su(即使 sudo 也使用 su) 只要您成功执行 sudo ./script2.sh 即可: 须藤 "#" //命令在此处以 root 身份 “#“ 出口 //这里使用的命令 你可以让它成为一个名为 sudo 的 shell 函数,但我认为没有其他更好的方法,但是脚本 inti、rc android ..etc 就是这种情况 一定要整洁;)

但是这需要你输入 NOPASSWD: su 这确实是完全安全的

这里的任何方式都缺少过滤的 POISX 权限原则,因此不要对所有用户启用某些内容,反之亦然 简单地说,只要你想调用 sudo 就可以了,不需要额外的东西:

chown root script.sh
chmod 0755 script.sh
chgrp sudo script.sh

"使 .sh 成为根所有者" “使其只读并为其他人执行” “并将其放入 sudo 组” 当然在 sudo 下 就是这样

【讨论】:

以上是关于在脚本内使用没有密码的 sudo的主要内容,如果未能解决你的问题,请参考以下文章

如何从需要 SUDO 的 php 调用 shell 脚本?

ubuntu运行sh脚本sudo自动输入密码

shell 脚本中的 su 和 sudo

需要 sudo 密码的 Bash 脚本

如何从脚本中为 sudo 提供密码?

在 Python 脚本中使用 sudo