我有一个可以作为sudo script.sh
或运行的脚本pkexec script.sh
如果脚本在仅通过名称运行时向用户询问密码,那么从用户的角度来看会更好script.sh
。
我如何“嵌入”请求pkexec
或sudo
以 root 权限运行整个脚本?
笔记sudo sh -c
由于脚本中有函数,因此运行所有内容可能不是最好的解决方案。
答案1
这会起作用:
echo "$(whoami)"
[ "$UID" -eq 0 ] || exec sudo "$0" "$@"
例子:
./test.sh
blade
[sudo] password for blade:
root
答案2
blade19899 的答案确实是正确的方法,但是也可以调用sudo bash
shebang:
#!/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
这使用 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>
。无论哪种情况,它都只会要求输入一次密码。