Zapytaj graficznie o hasło w skrypcie bash i zachowaj domyślne ustawienie limitu czasu sudo

9

Opcja sudo -A(SUDO_ASKPASS) najwyraźniej powoduje, że sudo traci ustawienie limitu czasu (np. Timestamp_timeout).

Chcę użyć opcji sudo -A, ale chcę zachować domyślny limit czasu (np. 15 minut na Ubuntu) w skrypcie bash. Chcę zapytać o hasło użytkownika bezpiecznie w oknie dialogowym GUI, ale chcę tylko raz zapytać o mój skrypt (nie ponad 50 razy).

Co więcej, nie chcę uruchamiać całego skryptu jako użytkownik root, ponieważ uważam, że to zły pomysł. Ponadto pliki utworzone przez mój skrypt mają w tym przypadku niewłaściwe własności.

Opcja sudo -A działałaby dla mnie, gdyby zachowała domyślny limit czasu.

Z podręcznika sudo:

Opcja: –A

Zwykle, jeśli sudo wymaga hasła, odczyta je z terminala użytkownika. Jeśli podano opcję ‑A (askpass), uruchamiany jest (ewentualnie graficzny) program pomocniczy, który odczytuje hasło użytkownika i wyprowadza hasło na standardowe wyjście. Jeśli zmienna środowiskowa SUDO_ASKPASS jest ustawiona, określa ścieżkę do programu pomocniczego. W przeciwnym razie, jeśli /etc/sudo.conf zawiera wiersz określający program askpass, ta wartość zostanie użyta. Na przykład:

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

BTW, kdesudo ma ten sam problem - wymaga hasła przy każdym wywołaniu, nawet jeśli sekundę później w tym samym skrypcie.

Używam Kubuntu 12.04 64 bit.

Oto pełny przykładowy przykład wszystkich części rozwiązania. Składa się ze skryptu bash, skryptu „myaskpass”, jak sugerowano tutaj , i pliku „.desktop”. Wszystko powinno być w 100% GUI (bez interakcji terminalu), więc plik .desktop jest niezbędny (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=

I sam skrypt testowy. Podczas korzystania z tego rozwiązania ten poprosi o podanie hasła dwukrotnie.

#!/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
MountainX
źródło
2
Czy gksudonie ma tu opcji? linux.die.net/man/1/gksudo
slm
Korzystam z KDE, więc gksudo nie jest dla mnie opcją, ale powiedziano mi, że działa tak samo jak kdesudo. kdesudocierpi na ten sam problem, który opisałem powyżej. Testowałem sudo -Ajako alternatywę kdesudoi jest to lepsze w mojej sytuacji, ale to nie rozwiązuje problemu z przekroczeniem limitu czasu (przynajmniej do tej pory).
MountainX

Odpowiedzi:

7

Dodaję to do mojego skryptu 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 &

Znaleziono to tutaj:

/server/266039/temporarlly-increase-sudos-timeout-for-the-duration-of-an-install-script

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

Używam innego skryptu, aby uruchomić mój główny skrypt i używam pliku .desktop, aby uruchomić ten skrypt pomocnika. Nie jest to bardzo proste, ale można go uruchomić w 100% GUI. Wciąż szukam idealnego rozwiązania, ale na razie to wystarcza.

MountainX
źródło
1

Co powiesz na gksudo ?

$ gksudo your_app_launcher.sh

Pokazuje graficzne okno dialogowe umożliwiające bezpieczne wprowadzenie hasła administratora.

woohoo
źródło