在 bash 腳本中以圖形方式詢問密碼並保留預設的 sudo 超時設置
(
sudo -A
SUDO_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://gist.github.com/cowboy/3118588
我使用另一個腳本來啟動我的主腳本,並使用 .desktop 文件來啟動該幫助腳本。它不是很簡單,但可以讓它工作 100% GUI。我仍在尋找完美的解決方案,但目前這正在奏效。