从脚本中请求 root 权限

从脚本中请求 root 权限

我有一个可以作为sudo script.sh或运行的脚本pkexec script.sh

如果脚本在仅通过名称运行时向用户询问密码,那么从用户的角度来看会更好script.sh

我如何“嵌入”请求pkexecsudo以 root 权限运行整个脚本?

笔记sudo sh -c由于脚本中有函数,因此运行所有内容可能不是最好的解决方案。

答案1

这会起作用:

echo "$(whoami)"

[ "$UID" -eq 0 ] || exec sudo "$0" "$@"

例子:

./test.sh 
blade
[sudo] password for blade: 
root

答案2

blade19899 的答案确实是正确的方法,但是也可以调用sudo bashshebang:

#!/usr/bin/sudo bash
# ...

明显的警告是,这仅在使用 调用脚本时才有效./script,并且一旦使用 调用脚本就会失败bash script

答案3

如果您想要一个漂亮的对话框,请尝试以下代码。这是我从我写的其他代码中直接摘录的,因此其中包含您可能不需要或不想要的额外内容,但它展示了总体思路:

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

sudo 对话框

这使用 whiptail,如果你还没有安装它,你可以安装它:

sudo apt-get install whiptail

答案4

我在脚本中需要 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 <scriptname>此脚本可以作为或运行<scriptname>。无论哪种情况,它都只会要求输入一次密码。

相关内容