linux 在脚本中使用不带密码的sudo

mec1mxoz  于 2023-03-22  发布在  Linux
关注(0)|答案(8)|浏览(157)

出于某种原因,作为用户,我需要在没有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更新”只是一个例子,与我的脚本实际上是什么。我的脚本有很多命令(与一些cd到root-access-only配置文件),解决方案不能是“好吧,直接用apt-get来做”。
举例的原则是帮助理解,而不是作为简化一般问题答案的借口。

bxpogfeg

bxpogfeg1#

从我的博客:IDMRockstar.com
问题是,有时我需要以root身份运行命令。下面是我在不泄露密码的情况下快速而肮脏的方法:

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

通过这种方式,系统会提示用户输入密码(并对终端隐藏),然后根据需要将密码传递给命令,因此我不会以root =的身份运行整个脚本)
如果你有更好的方法,我很乐意听一听!无论如何,我不是一个shell脚本Maven。
干杯!
.:Adam

bqf10yzr

bqf10yzr2#

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

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

其中user应该替换为用户的名称或id。(在更复杂的情况下,user可以替换为组或别名。有关详细信息,请参阅man sudoers。)
对于整个脚本的更大问题,有两种可能的方法:

方法一

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

./script1.sh

方式二

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

sudo ./script.sh
llew8vvj

llew8vvj3#

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

echo YourPasswordHere | sudo -S Command

提示符仍然会输出“输入密码”的文本,所以不要期望它会很简洁。
查看Askubuntu的文章

bogh5gae

bogh5gae4#

正如您所注意到的,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"命令。

x0fgdtte

x0fgdtte5#

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

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

此处需要可执行文件的完全限定路径。
然后在脚本中使用以下内容:

sudo apt-get update

这里不需要完全指定的名称。Sudo使用PATH环境变量进行可执行文件解析。
在更改和检查sudoers配置时,请确保保持另一个根会话打开以进行错误恢复。

unguejic

unguejic6#

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

cczfrluj

cczfrluj7#

正如Basilevs所提到的,您需要将用户添加到sudoers文件中,以避免脚本中的sudo命令在等待密码时卡住。
在Ubuntu 16上,有一个更简单的方法:只需将用户添加到sudo group,如下所示:

sudo usermod -aG sudo *username*

从那时起,它应该像一个魅力的工作。

注:

这只适用于以下行在文件/etc/sudoers中的情况:
%sudo ALL=NOPASSWD: ALL
(such行在组级别提供无密码sudo权限,在本例中为sudo组)
(if这一行不存在,你想添加它,请确保你使用visudo

2o7dmzc5

2o7dmzc58#

简单地说,为了以root身份执行命令,你必须使用su(即使sudo也使用su)只要你成功地执行了sudo ./script2.sh:sudo su“#”//commands as root here“#”exit //commands as use here you can make it a shell function with the name sudo,but no other better way I think,however it's case with scripts inti,rc android ..etc must be tidy ;)
但是,这需要您将NOPASSWD:这里确实很安全
这里的任何方式都缺乏POISX权限原则,这是过滤,所以不要对所有用户启用某些功能,反之亦然,只要你想要,就调用sudo,没有额外的东西:

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

“让.sh成为root的所有者”“让它成为只读的和exec的”“然后把它放到sudo组里”当然是在sudo下面就是这样

相关问题