当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

要手动执行修补,我必须输入此命令

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

如何在脚本中运行它?

还有其他一些命令但是这个命令很麻烦。

最佳解决办法

在脚本中包含sudo并不是一个好主意。而是从脚本中删除sudo并使用sudo运行脚本本身:

sudo myscript.sh

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

sudo -u username command 

空间是无关紧要的,它不应该影响任何东西,命令和它的参数之间总是有一个空格。

次佳解决办法

您可以修改sudoers文件。

运行sudo visudo

为您的用户名和要运行的脚本添加条目,而不要求输入密码。

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

第三种解决办法

你可以尝试类似的东西:

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

第四种办法

这个答案类似于terdon的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 run with root would be invoked
# with: sudo -u $real_user
# So they will be ran 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

第五种办法

#!/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

第六种办法

实际上有一种更简单的方法可以做到这一点。为了便于携带,这是我的实现,但随时可以根据您的需要进行操作。

在启动脚本时输入您的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

但是,如果其他人监视节点上运行的内容;可以访问由它创建的日志;或者只是在运行测试时随机查看,这可能会危及安全性。

这也适用于运行需要yes继续的命令/脚本:

echo $PW | yes | ./install.sh

回显是对提示的响应,因此,如果您按顺序运行其他提示进度的脚本,则可以使用您需要的任何内容。但要确保你知道订单,否则会发生不好的事情。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1440.html,未经允许,请勿转载。