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

Nil*_*xys 33 linux bash shell sudo

出于某种原因,作为用户,我需要在没有sudo的情况下运行脚本script.sh,它需要root权限才能工作.
我看到将sudo INSIDE script.sh作为唯一的解决方案.我们来举个例子:

script.sh :

#!/bin/sh
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

当然,如果我执行这个脚本,我会得到一个提示,要求我输入密码.然后我添加到我的sudoers文件(最后覆盖其他所有内容):

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我也试过这条线:

user ALL=(ALL) NOPASSWD:/path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

(我想我没有完全理解其中的区别)

但是如果我不使用sudo来执行这个脚本,这并不能解决我的问题:

# ./script.sh
[sudo] password for user: 
# sudo ./script.sh
Starts updating...
Run Code Online (Sandbox Code Playgroud)

好吧,所以我对自己说"好吧,这意味着如果我有一个像我一样的sudoers文件,只有当我用sudo打电话给他时,它才能正常工作,这不是我想要的".
好吧,我创建另一个脚本script2.sh如下:

script2.sh

#!/bin/sh
sudo /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

实际上它有效.但我对此解决方案并不满意,特别是因为我必须为每个命令使用2个脚本.

这篇文章是为了帮助人们解决这个问题,并寻找相同的解决方案(我没有找到一个好的帖子),也许有更好的解决方案来自你们.

随意分享您的想法!


编辑1:

我想坚持这样一个事实,即"apt-get update"只是我脚本实际上的一个例子.我的脚本有很多命令(有一些cd到root-access-only配置文件),解决方案不能"好吧,只需用apt-get直接执行".

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

Joh*_*024 16

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

user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
Run Code Online (Sandbox Code Playgroud)

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

方法1

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

./script1.sh
Run Code Online (Sandbox Code Playgroud)

方法2

sudoers为整个脚本添加一行.完成此操作后,不需要各个命令sudo.但是,sudo必须使用以下命令启动脚本:

sudo ./script.sh
Run Code Online (Sandbox Code Playgroud)

  • apt-get 就是一个例子。事实上,我的脚本有很多命令......我还不够笨,无法让脚本完全像 apt-get 那样做! (2认同)

小智 9

来自我的博客:IDMRockstar.com:

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

#! /bin/bash
read -s -p "Enter Password for sudo: " sudoPW
echo $sudoPW | sudo -S yum update
Run Code Online (Sandbox Code Playgroud)

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

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

干杯!

.: 亚当


Eat*_*ich 7

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

echo YourPasswordHere | sudo -S Command
Run Code Online (Sandbox Code Playgroud)

提示仍会打印"输入密码"文本以输出.所以不要指望它整洁.

看到这个Askubuntu帖子


dam*_*ois 5

如您所述,必须出现在sudoers配置中的文件是由其启动的文件sudo,而不是运行的文件sudo.

话虽如此,我们经常做的就是拥有类似的东西

user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

sudo配置中,script.sh脚本必须执行的所有命令.

然后我们定义Bash函数或别名,这script.sh实际上是

sudo /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

唯一的问题是如果某些命令不能以root身份运行,则需要su - user -c "command"在脚本中插入一些命令.