Shell-Script

在腳本中使用 sudo 時如何通過 GUI 提示詢問密碼?

  • April 29, 2020

我將 Trisquel GNU/Linux 與 GNOME 閃回桌面環境一起使用。sudo我需要一個 GUI 密碼提示,以便使用者在腳本中執行命令。範例考慮以下腳本:

zenity --question --text="Do you want to install this package?"
if [[ $? -eq 0 ]]; then sudo apt-get install package
else zenity --warning
fi

將按照以下方式(執行)執行,即不在終端內:

截屏

因此,需要詢問密碼才能執行命令,sudo否則無法完成工作。

因此,如何通過 GUI 提示詢問密碼?

您可以藉助**-A, --askpass**.sudo

sudo手冊頁:

-A, --askpass
                Normally, if sudo requires a password, it will read it from the user's terminal.  If the -A
                (askpass) option is specified, a (possibly graphical) helper program is executed to read the user's
                password and output the password to the standard output.  If the SUDO_ASKPASS environment variable
                is set, it specifies the path to the helper program.  Otherwise, if sudo.conf(5) contains a line
                specifying the askpass program, that value will be used.  For example:

                    # Path to askpass helper program
                    Path askpass /usr/X11R6/bin/ssh-askpass

                If no askpass program is available, sudo will exit with an error.

因此,您可以使用圖形輔助程序,例如ssh-askpass使用GNOME提示使用者輸入密碼:

$ which ssh-askpass
/usr/bin/ssh-askpass

因此,將以下行添加到/etc/sudo.conf

# Path to askpass helper program
Path askpass /usr/bin/ssh-askpass

你會發現 GUI 密碼提示:

螢幕截圖1

您也可以使用其他類似zenity的程序。我使用以下範例:

$ cat /etc/sudo.conf
# Path to askpass helper program
Path askpass /usr/local/bin/zenity_passphrase

直接用作命令zenity_passphrase的自定義腳本在哪裡:

$ cat $(which zenity_passphrase)
#!/bin/bash
zenity --password --title="sudo password prompt" --timeout=10

其工作原理如下:

螢幕截圖2


筆記:

  • 您也可以使用**gksudo**(用於 su 和 sudo 的 GTK+ 前端)而不是sudo在使用 GUI 提示符詢問的腳本中(gksu並且gksudo在 2019-2020 年已過時並放棄):

螢幕截圖3

  • 您還可以將**pkexec**(polkit應用程序)與一些(對於其他需要配置的)應用程序/命令一起使用:

截屏

引用自:https://unix.stackexchange.com/questions/254072