use*_*948 126 root sudo scripts
要手动打补丁,我必须输入这个命令
sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql
Run Code Online (Sandbox Code Playgroud)
09之前有一个空格:
sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql
Run Code Online (Sandbox Code Playgroud)
如何在脚本中运行它?
还有其他几个命令,但这个命令有问题。
ter*_*don 148
拥有sudo
内部脚本很少是一个好主意。相反,sudo
从脚本中删除并使用以下命令运行脚本本身sudo
:
sudo myscript.sh
Run Code Online (Sandbox Code Playgroud)
这样,脚本中的所有命令都将以 root 权限运行,并且您只需在启动脚本时提供一次密码。如果您需要在没有sudo
特权的情况下运行脚本中的特定命令,您可以以普通用户身份运行它(感谢Lie Ryan):
sudo -u username command
Run Code Online (Sandbox Code Playgroud)
空格是不相关的,它不应该影响任何东西,命令和它的参数之间总是有一个空格。
Kla*_*cha 51
您可能会修改该sudoers
文件。
运行sudo visudo
。
为您的用户名和脚本添加一个条目,您希望在不要求输入密码的情况下运行该脚本。
username ALL=(ALL) NOPASSWD: /path/to/script
Run Code Online (Sandbox Code Playgroud)
Jib*_*ers 31
你可以尝试这样的事情:
echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql
Run Code Online (Sandbox Code Playgroud)
这不是最安全的做法,因为您正在以纯文本形式编写 sudoer 密码。为了使它更安全,您可以创建一个变量并将 sudo 密码读入该变量,然后您可以执行以下命令:
echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql
Run Code Online (Sandbox Code Playgroud)
此外,如果您不介意以 root 身份执行所有命令,您可以使用 简单地执行您的脚本sudo
,如前所述。
sudo ./myscript
Run Code Online (Sandbox Code Playgroud)
Dan*_*Dan 21
这个答案类似于 terdon's answer。我还建议运行主脚本,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
Run Code Online (Sandbox Code Playgroud)
小智 8
实际上有一种更简单的方法可以做到这一点。为了可移植性,这是我的实现,但可以随意操作它以满足您的需要。
在启动脚本时输入您的 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>
Run Code Online (Sandbox Code Playgroud)
您可以在脚本启动后添加提示和捕获,如下所示:
echo "enter the sudo password, please"
read PW
Run Code Online (Sandbox Code Playgroud)
但是如果其他人监视节点上运行的内容;可以访问由它创建的日志;或者只是在运行测试时随机查看您的应该,这可能会危及安全。
这也适用于运行需要 yes 才能继续的命令/脚本:
echo $PW | yes | ./install.sh
Run Code Online (Sandbox Code Playgroud)
echo 是对提示的响应,因此您可以使用任何您需要的东西,如果您正在运行其他有进度提示的脚本,则按顺序排列。但是,请确保您知道该顺序,否则可能会发生不好的事情。