出于某种原因,作为用户,我需要在没有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来做”。
举例的原则是帮助理解,而不是作为简化一般问题答案的借口。
8条答案
按热度按时间bxpogfeg1#
从我的博客:IDMRockstar.com:
问题是,有时我需要以root身份运行命令。下面是我在不泄露密码的情况下快速而肮脏的方法:
通过这种方式,系统会提示用户输入密码(并对终端隐藏),然后根据需要将密码传递给命令,因此我不会以root =的身份运行整个脚本)
如果你有更好的方法,我很乐意听一听!无论如何,我不是一个shell脚本Maven。
干杯!
.:Adam
bqf10yzr2#
如果你想在没有密码的情况下运行
sudo /usr/bin/apt-get update
,你需要有sudoers条目:其中
user
应该替换为用户的名称或id。(在更复杂的情况下,user
可以替换为组或别名。有关详细信息,请参阅man sudoers
。)对于整个脚本的更大问题,有两种可能的方法:
方法一
对于脚本中需要
sudo
的每个命令,在sudoers
中专门为该命令创建一行。在这种情况下,可以正常调用脚本:方式二
在
sudoers
中为整个脚本放置一行。完成后,单个命令不需要sudo
。但是,必须使用sudo
来启动脚本,如下所示:llew8vvj3#
如果你的密码不是你想非常安全的东西,(也许是公司的一些测试服务器等)你可以通过echo在脚本中提升到sudo,比如:
提示符仍然会输出“输入密码”的文本,所以不要期望它会很简洁。
查看Askubuntu的文章
bogh5gae4#
正如您所注意到的,sudoers配置中必须出现的文件是由
sudo
启动的文件,而不是运行sudo
的文件。话虽如此,我们经常做的,是有一些像
在
sudo
配置中,其中script.sh
具有脚本必须执行的所有命令。然后,我们定义一个Bash函数或别名,使
script.sh
实际上是唯一的问题是,如果某些命令不能以root身份运行,则需要在脚本中插入一些
su - user -c "command"
命令。x0fgdtte5#
在新的/etc/sudoers.d/apt-get文件中,放入单行:
此处需要可执行文件的完全限定路径。
然后在脚本中使用以下内容:
这里不需要完全指定的名称。Sudo使用PATH环境变量进行可执行文件解析。
在更改和检查sudoers配置时,请确保保持另一个根会话打开以进行错误恢复。
unguejic6#
我建议您查看sudo环境变量-特别是您可以使用(并检查)$SUDO_USER。使用sudo(sudoers中的1个条目)调用脚本,然后以SUDO_USER执行用户操作,以root执行root操作。
cczfrluj7#
正如Basilevs所提到的,您需要将用户添加到
sudoers
文件中,以避免脚本中的sudo
命令在等待密码时卡住。在Ubuntu 16上,有一个更简单的方法:只需将用户添加到
sudo group
,如下所示:从那时起,它应该像一个魅力的工作。
注:
这只适用于以下行在文件
/etc/sudoers
中的情况:%sudo ALL=NOPASSWD: ALL
(such行在组级别提供无密码sudo权限,在本例中为
sudo
组)(if这一行不存在,你想添加它,请确保你使用
visudo
)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,没有额外的东西:
“让.sh成为root的所有者”“让它成为只读的和exec的”“然后把它放到sudo组里”当然是在sudo下面就是这样