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

出于某种原因,我需要,作为用户,没有sudo运行脚本script.sh需要root权限才能工作。
我看到把sudo INSIDE script.sh作为唯一的解决scheme。 举个例子:

script.sh : #!/bin/sh sudo apt-get update 

当然,如果我执行这个脚本,我会得到一个提示,要求我input密码。 然后我添加到我的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... 

那么,我对自己说:“好的,那就是说,如果我像我一样有一个文件,那么只有我用sudo给他打电话,没有任何提示,那不是我想要的。”
所以,好吧,我创build另一个脚本script2.sh如下:

 script2.sh #!/bin/sh sudo /path/to/script.sh 

事实上,它的作品。 但是我并不真正满意这个解决scheme,特别是我必须为每个命令使用两个脚本。

这篇文章是帮助有这个问题的人find相同的解决scheme(我没有find一个好的文章),也许有更好的解决scheme来自你们。

随意分享您的想法!


编辑1:

我想坚持这样一个事实,即这个“apt-get update”只是我的脚本实际上是一个例子FAR。 我的脚本有很多命令(有一些cd只能访问rootconfiguration文件),解决scheme不能是“好的,直接使用apt-get”。

举一个例子的原理是帮助理解,而不是为了简化一般问题的答案。

Solutions Collecting From Web of "在没有密码的情况下使用sudo INSIDE脚本"

如果你想运行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 

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

 echo YourPasswordHere | sudo -S Command 

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

(注意,从其他资源中找到这个,不记得在哪里。)

正如你所指出的那样,必须出现在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"命令。

来自我的博客: IDMRockstar.com :

踢球者有时候,我需要以root身份运行命令。 下面是我在不泄露密码的情况下实现的快速和肮脏的方法:

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

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

如果你有更好的方法,我很乐意听到它! 我不是一个shell脚本专家。

干杯!

。: 亚当

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

简单地说,为了以root身份执行命令,你必须使用su(即使sudo使用su),只要你成功执行sudo ./script2.sh就可以了:sudo su“#”//作为root的命令在这里“#”exit / /命令在这里使用,你可以使它的名字为sudo的shell函数,但没有其他更好的方式,我认为,但是这是脚本inti的情况下,rc android .. etc必须是整洁;)

然而这要求你把NOPASSWD:su确实是非常安全的

这里的任何方式只是缺乏POISX权限的原则,即过滤,所以不要给所有用户启用一些东西,反之亦然,只需要调用sudo即可,不需要额外的东西:

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

“让root用户拥有.sh”“让它只读和exec为他人”“并把它放在sudo组”当然在sudo下就是这样

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

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

这里需要完整合格的可执行文件路径。

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

 sudo apt-get update 

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

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

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

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

 sudo usermod -aG sudo *username* 

从此,它应该像魅力一样工作。

注意:

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

%sudo ALL=NOPASSWD: ALL

(这一行在组级别给予无密码的sudo权限,在本例中为sudo组)

(如果这行不存在,你想添加它,请确保你使用visudo