Chcę napisać automatyczny skrypt poinstalacyjny w Bash ( post-install.sh
na przykład nazywany ). Skrypt automatycznie doda i zaktualizuje repozytoria, zainstaluje i zaktualizuje pakiety, edytuje pliki konfiguracyjne itp.
Teraz, jeśli wykonam ten skrypt, na przykład za pomocą sudo post-install.sh
, czy będę proszony o podanie sudo
hasła tylko raz, czy też będę musiał wprowadzać sudo
hasło przy każdym wywołaniu polecenia w skrypcie, które wymaga sudo
pozwolenia? Innymi słowy, czy polecenia w skrypcie bash „dziedziczą” uprawnienia do wykonywania, że tak powiem?
A jeśli rzeczywiście tak jest, czy nadal istnieje możliwość, że sudo
uprawnienia przekroczą sudo
limit czasu (jeśli na przykład określone polecenie trwa wystarczająco długo, aby przekroczyć limit czasu)? Czy też początkowe wprowadzanie sudo
hasła będzie trwało przez cały czas trwania całego skryptu?
źródło
Odpowiedzi:
Tak, raz, na czas działania skryptu.
UWAGA: Po podaniu poświadczeń
sudo
uwierzytelnianie zwykle trwa 5 minut w powłoce, w której zostało wpisane hasło. Dodatkowo wszelkie procesy potomne, które zostaną wykonane z tej powłoki, lub dowolny skrypt działający w powłoce (twój przypadek) będzie również działał na podwyższonym poziomie.Nie, nie przekroczą limitu czasu w skrypcie. Tylko jeśli interaktywnie wpisujesz je w powłoce, w której podano poświadczenia. Za każdym razem, gdy
fragment strony podręcznika sudosudo
wykonywane jest w tej powłoce, limit czasu jest resetowany. Ale w twoim przypadku poświadczenia pozostaną, dopóki skrypt będzie wykonywał i uruchamiał polecenia z jego wnętrza.źródło
sudo -u $(logname) <command>
powinno działać.bash
a wszystkie jego procesy potomne będą działały z uprawnieniami administratora. Nie musisz więc ponownie wpisywać hasła do poleceń w skrypcie bash.sudo
Limitu czasu ma zastosowanie wyłącznie do (później) oddzielnej pwsudo
. Nie wpłynie to na już uruchomiony proces bash ani na żadnego z jego potomków.źródło
Wszystkie te odpowiedzi są prawdopodobnie poprawne. Nie jest to jednak powszechnie używany sposób (o ile mi wiadomo) do tworzenia skryptów bash, które wymagają
sudo
uprawnień. Ogólnie rzecz biorąc, u góry skryptu zakładasz, że nie został on uruchomiony zsudo
uprawnieniami i zamiast tego zadzwoń dosudo -v
siebie (co poprosi użytkownika o podanie hasła), aby „skonfigurować”sudo
„sesję”. Możesz alboecho
napisać tekst wyjaśniający przed pytaniem, albo zastąpićsudo
własny monit-p
przełącznikiem, aby poinformować użytkownika, że potrzebujeszsudo
dostępu do niektórych poleceń.Następnie w skrypcie powinieneś móc wywoływać
sudo
polecenia, które tego wymagają (i tylko te, które tego wymagają) bez dalszych żądań hasła. Jeśli uważasz, że pewna grupa poleceń, które działają razem w twoim skrypcie (niezależnie od ich własnego użyciasudo
), wykracza poza limit czasu sudo, możesz zadzwonićsudo -v
w środku, aby wydać rodzajsudo
sesji „utrzymywania przy życiu” „.Jeśli
sudo
sesja wygasa podczas skryptu, użytkownik zostanie po prostu poproszony o podanie hasła przy następnym uruchomieniu polecenia sudo w skrypcie.źródło
sudo -v
gdy zadzwonisz, ponownie poprosi użytkownika o podanie hasła. Moim zdaniem nie najgorszy problem. Może być pomocny, uświadomienie użytkownikowi mechanizmu może być przydatne.sudo -u $SUDO_USER
spowodowanie, aby wszystkie polecenia inne niż root działały bez podniesienia uprawnień. Niestety dodaje więcej kodu, ale jest to jedyny niezawodny sposób na wykonanie rootowania w długim procesie./etc/sudoers.d
użyciuvisudo -c -f /tmp/tempsudoers
, aby upewnić się, że plik jest prawidłowy przed skopiowaniem go na miejscu, a następnie usuń ten plik raz zrobić (użycie pułapki na wyjściu / błędzie, aby upewnić się, że eskalacji nie można nadużyć). Najbardziej bezpieczna implementacja pozwoliłaby użytkownikowi na uruchamianie określonych poleceń w skrypcie z określonymi argumentami bez hasłaNOPASSWD
, zapisując każdą komendę / argumenty w tablicy w celu zbudowania pliku.sudo
sesji przy życiu, jeśli dane zadanie trwa dłużej niż limit czasu. Tę technikę spotkałem pewnego dnia w repozytorium dotfiles Mathiasa Bynensa:while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13