Bash

在 bash 腳本中以圖形方式詢問密碼並保留預設的 sudo 超時設置

  • October 25, 2014

( sudo -ASUDO_ASKPASS) 選項顯然會導致 sudo 失去超時(例如,timestamp_timeout)設置。

我想使用 sudo -A 選項,但我想在 bash 腳本中保留預設超時(例如,在 Ubuntu 上為 15 分鐘)。我想在 GUI 對話框中安全地詢問使用者密碼,但我只想提示一次我的腳本(而不是 50 多次)。

此外,我不想以 root 使用者身份執行我的整個腳本,因為我認為這是一個壞主意。此外,在這種情況下,由我的腳本創建的文件擁有錯誤的所有權。

如果 sudo -A 選項保留預設超時,它將對我有用。

從 sudo 手冊:

選項:-A

通常,如果 sudo 需要密碼,它會從使用者終端讀取密碼。如果指定了 ‑A (askpass) 選項,則會執行一個(可能是圖形的)幫助程序來讀取使用者的密碼並將密碼輸出到標準輸出。如果設置了 SUDO_ASKPASS 環境變數,它指定了幫助程序的路徑。否則,如果 /etc/sudo.conf 包含指定 askpass 程序的行,則將使用該值。例如:

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

順便說一句,kdesudo 也有同樣的問題——每次呼叫它時都需要密碼,即使在同一個腳本中只是一秒鐘之後。

我正在使用 Kubuntu 12.04 64 位。

這是解決方案所有部分的完整工作範例。它由 bash 腳本、此處建議的“myaskpass”腳本和“.desktop”文件組成。整個事情應該是 100% GUI(根本沒有終端互動),所以 .desktop 文件是必不可少的(afaik)。

$ cat myaskpass.sh 
#!/bin/bash
kdialog --password "Please enter your password: "
exit 0


$ cat askpasstest1.desktop 
#!/usr/bin/env xdg-open
[Desktop Entry]
Comment=SUDO_ASKPASS tester1
Exec=bash /home/user/test/askpasstest1.sh
GenericName=SUDO_ASKPASS tester1
Name=SUDO_ASKPASS tester1
NoDisplay=false
Path[$e]=
StartupNotify=true
Terminal=false
TerminalOptions=
Type=Application
Categories=Application;Utility;
X-KDE-SubstituteUID=false
X-KDE-Username=

還有一個測試腳本本身。使用此解決方案時,這將要求您輸入兩次密碼。

#!/bin/bash

sudo -k
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass1
touch filemadeas_regularuser1
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass2
touch filemadeas_regularuser2
ls -la filemadeas* > /home/user/test/fma.log
kdialog --title "Files Created" --textbox /home/user/test/fma.log 640 480
sudo rm filemadeas_*
rm fma.log

exit 0

我將此添加到我的 bash 腳本中:

# ask for password up-front.
sudo -v
# Keep-alive: update existing sudo time stamp if set, otherwise do nothing.
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &

在這裡找到它:

https://serverfault.com/questions/266039/temporarlly-increasing-sudos-timeout-for-the-duration-of-an-install-script

https://gist.github.com/cowboy/3118588

我使用另一個腳本來啟動我的主腳本,並使用 .desktop 文件來啟動該幫助腳本。它不是很簡單,但可以讓它工作 100% GUI。我仍在尋找完美的解決方案,但目前這正在奏效。

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