- 目标: 在终端模拟器中运行一个 shell 脚本,该脚本中有一段命令需要让程序以 root 权限运行时,我希望用程序
zenity(一个能实现弹出文本提示、输入框和交互按钮的gtk工具)代替原本在终端中提示输入密码的方式,换成弹出“请输入密码”的提示框并接受输入的密码,然后把密码传递给sudo。 - 尝试过的方法:
简化后的实现代码如下(假设文件为 /path/to/script):
#!/bur/bin/dash
# Shebang 为 dash
# 可执行文件路径
exec_file=/path/to/file
# 存放密码的变量
password=$(zenity --password --title="需要管理员权限" --text="请输入密码:")
# 判断是否有输入密码
if [ $? -eq 0 ] && [ -n "$password" ]; then
# 将密码传递给 sudo
echo "$password" | sudo -SE dash -c "export DISPLAY=\"$DISPLAY\"; export XAUTHORITY=\"$XAUTHORITY\"; \"${exec_file}\"" > /dev/null
# 删掉临时变量
unset password
exit $?
fi
在终端模拟器中执行该文件:/path/to/script
- 实际效果: zenity 与程序均能正常执行(弹出输入密码提示、接收密码并用
sudo执行程序),但输入完密码,在程序正常运行过程中终端中依旧出现一行[sudo] password for Username:并等待输入密码;关闭程序后,终端显示[sudo] password for leafat: %,直接结束命令,不再等待密码输入。