从脚本中请求root权限
我有一个可以作为sudo script.sh
或pkexec script.sh
运行的脚本
如果脚本在通过名称script.sh
运行时要求用户输入密码,那么从用户的角度来看会更好。
如何“嵌入” pkexec
或sudo
请求以root权限运行整个脚本?
请注意 ,使用sudo sh -c
运行所有内容可能不是最好的解决方案,因为我在脚本中有函数。
这个工作:
echo "$(whoami)" [ "$UID" -eq 0 ] || exec sudo "$0" "$@"
例:
./test.sh blade [sudo] password for blade: root
如果您想要一个漂亮的对话框,请尝试这样的事情。 我直接用我写的其他东西撕掉了,所以它有你可能不需要或不想要的额外东西,但它显示了一般的想法:
brand="My Software" # Check that the script is running as root. If not, then prompt for the sudo # password and re-execute this script with sudo. if [ "$(id -nu)" != "root" ]; then sudo -k pass=$(whiptail --backtitle "$brand Installer" --title "Authentication required" --passwordbox "Installing $brand requires administrative privilege. Please authenticate to begin the installation.\n\n[sudo] Password for user $USER:" 12 50 3>&2 2>&1 1>&3-) exec sudo -S -p '' "$0" "$@" <<< "$pass" exit 1 fi
这使用whiptail,如果您还没有它,可以安装它:
sudo apt-get install whiptail
blade19899的答案确实是要走的路,不过也可以在shebang中调用sudo bash
:
#!/usr/bin/sudo bash # ...
显而易见的警告是,只有使用./script
调用脚本时,这将起作用,并且一旦使用bash script
调用脚本,它就会失败。
我在脚本中编写了需要使用sudo
root访问的sudo
– 如果用户尚未获得权限,则脚本会在此时提示输入密码。
例
#!/bin/sh mem=$(free | awk '/Mem:/ {print $4}') swap=$(free | awk '/Swap:/ {print $3}') if [ $mem -lt $swap ]; then echo "ERROR: not enough RAM to write swap back, nothing done" >&2 exit 1 fi sudo swapoff -a && sudo swapon -a
此脚本可以作为sudo
或
。 在任何一种情况下,它只会要求输入一次密码。
似乎没有其他人在这里解决了明显的问题。 将sudo
放在您随后分发的脚本中会增加用户的不良习惯 。 (我假设你正在分发它,因为你提到“从用户的角度来看。”)
事实上,有一个使用应用程序和脚本的指导方针,类似于银行业务中的安全原则: 永远不要将您的个人信息提供给给您打电话的人,并说他们“从您的银行”打电话 ,并且存在出于类似的原因。
申请规则是:
除非您确定使用密码,否则切勿在出现提示时输入密码。 这适用于任何有sudo
访问权限的人。
如果您输入密码是因为您在命令行上运行了sudo
,那太好了。 如果您因为运行SSH命令而输入它,那很好。 如果您在登录计算机时输入内容,当然很棒。
如果您只是运行外部脚本或可执行文件并在提示输入密码时输入密码,则您不知道脚本正在使用它做什么。 根据你所知,它可以将它存储在纯文本的临时文件中,甚至可能无法自行清理。
显然,以root
身份运行一组未知命令存在单独和额外的问题,但我在这里谈论的是保持密码本身的安全性。 即使假设应用程序/脚本不是恶意的,您仍然希望安全地处理您的密码,以防止其他应用程序获取并恶意使用它。
因此,我个人对此的回应是,如果需要root权限,最好放入脚本中:
#!/bin/bash [ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;} # do privileged stuff, etc.
我是这样做的:
echo -n "Enter password for sudo rights: " read -s pass echo $pass | sudo -S [your command here]