【求助】如何让 zenity 作为 sudo 密码输入提示时在终端不重复显示 sudo 提示

  • 目标: 在终端模拟器中运行一个 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: %,直接结束命令,不再等待密码输入。

首先爲何不用 pkexec ?
桌面環境如果提供了 polkit agent 的話,pkexec 問密碼就是 GUI 的,然後 pkexec 執行命令就有 root 特權了。

一定要用 zenity 的話,爲何不用 sudo 自帶的 --askpass 機制?

$ cat /usr/local/bin/zenity-askpass
#!/bin/sh
zenity --password --title="需要管理员权限" --text="请输入密码:"

$ SUDO_ASKPASS='/usr/local/bin/zenity-askpass' sudo -A echo a
a

這樣感覺就是你想要的效果

1 Like