Jeśli wykonam sudo plik skryptu Bash, czy wszystkie polecenia w skrypcie Bash będą również wykonywane jako sudo?

30

Chcę napisać automatyczny skrypt poinstalacyjny w Bash ( post-install.shna 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 sudohasła tylko raz, czy też będę musiał wprowadzać sudohasło przy każdym wywołaniu polecenia w skrypcie, które wymaga sudopozwolenia? 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 sudouprawnienia przekroczą sudolimit czasu (jeśli na przykład określone polecenie trwa wystarczająco długo, aby przekroczyć limit czasu)? Czy też początkowe wprowadzanie sudohasła będzie trwało przez cały czas trwania całego skryptu?

Przyzwoity Dabbler
źródło
4
Być może zainteresuje Cię kilka narzędzi specjalnie zaprojektowanych do tego zadania. 3 typowe to: Marionetka, szef kuchni i lalka.
spuder
@spuder, a dla większej architektury korporacyjnej i bezpieczeństwa zarządzania konfiguracją możesz użyć CFEngine 3. (Nie dla osób o słabym sercu, ani jednorazowych poleceń).
Wildcard

Odpowiedzi:

38

P # 1: Czy będę proszony o podanie hasła sudo tylko raz, czy będę musiał wprowadzać hasło sudo przy każdym wywołaniu polecenia w skrypcie, które wymaga pozwolenia sudo?

Tak, raz, na czas działania skryptu.

UWAGA: Po podaniu poświadczeń sudouwierzytelnianie 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.

Pytanie nr 2: czy nadal istnieje możliwość przekroczenia limitu czasu uprawnień sudo (jeśli na przykład określone polecenie trwa wystarczająco długo, aby przekroczyć limit czasu sudo)? A może początkowe hasło sudo będzie działać przez cały czas trwania całego skryptu?

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 sudowykonywane 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.

fragment strony podręcznika sudo

Limit ten jest specyficzny dla polityki; domyślny limit czasu hasła strategii bezpieczeństwa sudoers wynosi 5 minut.

slm
źródło
1
Odpowiedź na pytanie 1 brzmi: „Nie, nie pojawi się ponownie monit”.
dannysauer
@dannysauer - przeczytaj jego Q ponownie. Mówię „tak”, aby monit o hasło był wyświetlany tylko raz!
slm
Pytanie brzmi „czy to a lub b”, a samo powiedzenie „tak” nie wyjaśniło, czy było to „tak, a” czy „tak, b”. Próbuję wyjaśnić przyszłym czytelnikom. : D
dannysauer
@dannysauer - patrz aktualizacja.
slm
1
To nowe pytanie byłoby to: stackoverflow.com/questions/3522341/... . sudo -u $(logname) <command>powinno działać.
Gauthier
17

basha 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.

sudoLimitu czasu ma zastosowanie wyłącznie do (później) oddzielnej pw sudo. Nie wpłynie to na już uruchomiony proces bash ani na żadnego z jego potomków.

Laurence Gonsalves
źródło
3

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ą sudouprawnień. Ogólnie rzecz biorąc, u góry skryptu zakładasz, że nie został on uruchomiony z sudouprawnieniami i zamiast tego zadzwoń do sudo -vsiebie (co poprosi użytkownika o podanie hasła), aby „skonfigurować” sudo„sesję”. Możesz albo echonapisać tekst wyjaśniający przed pytaniem, albo zastąpić sudowłasny monit -pprzełącznikiem, aby poinformować użytkownika, że ​​potrzebujesz sudodostępu do niektórych poleceń.

Następnie w skrypcie powinieneś móc wywoływać sudopolecenia, 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życia sudo), wykracza poza limit czasu sudo, możesz zadzwonić sudo -vw środku, aby wydać rodzaj sudosesji „utrzymywania przy życiu” „.

Jeśli sudosesja wygasa podczas skryptu, użytkownik zostanie po prostu poproszony o podanie hasła przy następnym uruchomieniu polecenia sudo w skrypcie.

alexrussell
źródło
1
Powiedz, że jednym z etapów skryptu jest zbudowanie nowego jądra systemu Linux, co może zająć dwie godziny. Utrzymanie sesji przy życiu może być wyzwaniem, jak sobie z tym poradziłeś?
Gauthier
Nie możesz Ale następnym razem, sudo -vgdy 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.
alexrussell
Odwrotną sytuacją jest wymaganie od użytkownika wywołania skryptu za pomocą sudo dla innych odpowiedzi, a następnie sudo -u $SUDO_USERspowodowanie, 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.
dragon788
Chyba powinienem wyjaśnić, inny inny sposób to zrobić byłoby nazwać sudo raz na początku skryptu umieścić plik tymczasowy w /etc/sudoers.dużyciu visudo -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ła NOPASSWD, zapisując każdą komendę / argumenty w tablicy w celu zbudowania pliku.
dragon788
Nieco późno wracam tutaj do @Gauthier, ale wydaje mi się, że się myliłem, kiedy powiedziałem, że nie możesz utrzymać sudosesji 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
alexrussell