在没有密码的情况下使用sudo INSIDE脚本

时间:2014-08-09 05:46:09

标签: linux bash shell sudo

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

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

8 个答案:

答案 0 :(得分:16)

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

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

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

方法1

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

./script1.sh

方法2

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

sudo ./script.sh

答案 1 :(得分:8)

如果您的密码不是您想要的,(可能是公司的某些测试服务器等),您可以通过echo升级到脚本中的sudo:

echo YourPasswordHere | sudo -S Command

提示仍会打印&#34;输入密码&#34;文本输出虽然。所以不要期待它整洁。

请参阅此Askubuntu post

答案 2 :(得分:7)

来自我的博客:IDMRockstar.com

踢球者有时,我需要以root身份运行命令。这是我在不泄露密码的情况下快速而肮脏的方式:

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

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

如果你有更好的方式,我很乐意听到它!我无论如何都不是shell脚本专家。

干杯!

:Adam

答案 3 :(得分:5)

如您所述,必须出现在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"命令。

答案 4 :(得分:2)

我建议你看一下sudo环境变量 - 具体来说你可以使用(并检查)$ SUDO_USER。用sudo(sudoers中的1个条目)调用你的脚本,然后用root用户身份作为SUDO_USER和root用户。

答案 5 :(得分:1)

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

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

此处需要完全限定的可执行路径。

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

sudo apt-get update

此处,不需要完全指定的名称。 Sudo使用PATH环境变量进行可执行解析。

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

答案 6 :(得分:1)

简单地说,为了以root身份执行命令,你必须使用su(甚至sudo使用su) 只要您成功执行sudo ./script2.sh:     sudo su  &#34;#&#34; //在这里以root身份命令  &#34;#&#34;出口 //命令在这里使用 你可以把它变成一个名为sudo的shell函数,但我认为没有其他更好的方法,不过它是脚本inti,rc android ..etc的情况 必须整洁;)

然而,这需要你把NOPASSWD:su确实是完全安全的

这里的任何方式都缺乏POISX权限原则,这是过滤所以不对所有用户启用某些东西,反之亦然 简单地说,无需额外的事情就可以根据需要调用sudo:

Connection.ConnectionId

&#34;制作.sh&#34;的根拥有者 &#34;让它成为只读和执行其他人&#34; &#34;并将其放入sudo组&#34; 当然在sudo下 那是

答案 7 :(得分:-1)

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

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

sudo usermod -aG sudo *username*

从那以后,它应该像魅力一样。

注意:

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

%sudo ALL=NOPASSWD: ALL

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

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