如何在脚本中运行“ sudo”命令?


84

要手动制作补丁,我必须输入以下命令

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

09之前有一个空格:

sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

如何在脚本中运行它?

还有其他几个命令,但这给您带来麻烦。


2
只需将其放在脚本中,有什么问题?
Lie Ryan

6
@LieRyan- sudo 密码 -如果没有人输入该脚本,该脚本将无法完全运行。
Wilf

我的系统无需提示即可正常运行它们。2017年10月的Ubuntu 16.04。您搞砸了sudoers设置。没什么大不了。它只需要固定。
SDsolar '17

1
@SDsolar 您的系统很混乱。这是一个较小的安全漏洞,不会提示您输入密码(使用户更容易受到某些类型的社会工程学攻击)。
wizzwizz4

Answers:


107

具有sudo内部脚本很少是一个好主意。相反,请sudo从脚本中删除,然后使用以下命令运行脚本本身sudo

sudo myscript.sh

这样,脚本中的所有命令都将以root特权运行,并且您只需要在启动脚本时输入一次密码即可。如果您需要脚本中的特定命令在没有sudo特权的情况下运行,则可以使用(感谢Lie Ryan)作为普通用户运行它:

sudo -u username command 

该空间无关紧要,不应影响任何内容,命令与其参数之间始终存在一个空间。


30
脚本中可能有一些不需要root特权的命令,您可以使用sudo -u username暂时删除那些命令的root特权
Lie Ryan

48
我编写的许多脚本会进行大量用户交互和/或错误检查。然后,最后需要执行一个命令-类似于rsync-以root身份运行。当只有一个或几个命令需要访问权限时,为什么我要使整个程序运行起来,让我自己接触很多可能包含严重错误或具有root用户访问权限的漏洞的代码行(尤其是在调试时)?

2
@乔公平。将“从不好主意”更改为“很少”。
terdon

10
@Joe在这里很有意思。同样,当有人说不这样做时,很高兴知道确切的原因,或者至少在什么情况下我不应该这样做,以及为什么
阿雷奥内

10
@terdon您没有在听。我知道,如果您以root用户身份运行脚本,它将永远不会提示您输入sudo。我将之与不以root用户身份运行脚本而不是sudo在脚本中放置显式调用进行比较,因为如果只有少数狭窄的操作需要root用户,将整个脚本提升为root用户可能是一个糟糕的主意。在这种情况下,我特别回应您的评论:“主要是因为这意味着您不能自动运行脚本,因为每次需要输入密码时,都需要输入密码。”
BeeOnRope

41

您可以修改sudoers文件。

运行sudo visudo

为您的用户名和脚本添加一个条目,您无需输入密码即可运行该脚本。

username ALL=(ALL) NOPASSWD: /path/to/script

2
没为我工作,但是谢谢,很高兴知道这是存在的。也许我弄错了语法。
克里斯·K

5
不确定是否有人提到它,但是在编辑sudoers文件后,必须终止该用户的所有登录会话。
escape-llc 2015年

1
在这里只是要澄清的是,不是应该在sudoers文件中指定包含“ sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql”行的脚本,而是playing_delete_data_patch.sh脚本或您想要该用户和/或他们的其他命令无需指定密码即可通过sudo运行的脚本。
MttJocy

19

您可以尝试类似:

echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

这不是最安全的操作,因为您正在以纯文本形式编写sudoer密码。为了使其更加安全,您可以创建一个变量并将sudo密码读入该变量,然后可以执行以下命令:

echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

另外,如果您不介意所有命令都以root身份执行,则可以使用sudo,如先前建议的那样简单地执行脚本。

sudo ./myscript

安全地将密码读取到变量中:read -s PASSWORD
Tobias Uhmann,

10

这个答案类似于terdon的答案。我还建议使用运行主脚本,sudo以便脚本可以在执行过程中运行而无需询问用户密码。

但是,如果要对某些命令放弃root特权并以调用该命令的实际用户身份运行它们,则sudo可以检查$SUDO_USER变量以找出原始用户。

这是一个示例脚本,说明如何实现此目的:

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $SUDO_USER ]; then
    real_user=$SUDO_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want running as root would be invoked
# with: sudo -u $real_user
# So they will be run as the user who invoked the sudo command
# Keep in mind if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without sudo
# root-command

4

实际上,有一种更简单的方法可以做到这一点。对于可移植性,这是我的实现,但是可以随时对其进行操作以满足您的需要。

启动脚本时,输入您的sudo密码作为参数,捕获该密码,并使用将提示您输入sudo密码的每个命令将其回显。

#!/bin/bash

PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>

您可以在脚本启动后添加提示并捕获,如下所示:

echo "enter the sudo password, please"
read PW

但是,如果有人监视该节点上正在运行的内容,则该状态将被监视。有权访问由其创建的日志;或只是在运行测试时随机查看您的需求,这可能会损害安全性。

这也适用于运行需要“是”才能继续的命令/脚本:

echo $PW | yes | ./install.sh

回显是对提示的响应,因此,如果您正在运行其他具有进度提示的脚本,则可以在那里使用所需的任何内容。但是,请确保您知道顺序,否则可能会发生不良情况。


那是如此优雅和简单,我很高兴我一直向下滚动!编辑:等待,这将密码添加到我的终端的历史
招聘

1
如何通过以下方式请求用户名/密码readryanstutorials.net/bash-scripting-tutorial/bash-input.php那应该避免此问题
Job

3
#!/bin/bash
# this declares that current user is a sudoer
sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
sudo npm install hexo-cli -g
mkdir Untitled
sudo apt-get install python

# then to remove the sudo access from the current user
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

0

您可以尝试将运行脚本的用户添加到sudoers文件中:

#give permissions to the file
sudo chmod 700 /etc/sudoers.d/useradm

sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
sudo chmod 440 /etc/sudoers.d/useradm

通常,这是一种较差的方法。如果要添加NOPASSWD sudo规则,尤其是对于运行自动化的帐户,则应至少将它们限制为运行的确切命令(而不是全部)
Christopher Hunter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.