Piszę skrypt (właściwie kombinację skryptów i makefile), który instaluje zależności zewnętrzne: niektóre apt-get
polecenia, niektóre git
klonowanie, budowanie, instalowanie, dodawanie użytkowników do grup, ...
Niektóre operacje w tych skryptach wymagają uprawnień administratora, inne nie.
Do tej pory prowadziłem cały proces make z sudo, ale ma on pewne wady:
git
repos, które klonuję, otrzymujęroot
jako właściciel, co oznacza, że nie mogę ich później modyfikować bezsudo
lubchown
- skrypty, które dodają użytkowników do grup, od czasu
whoami
powrotu nie wiedzą, którego użytkownika dodaćroot
Jaki jest najlepszy sposób działania jako superużytkownik tylko tych poleceń, które go wymagają? Idealnie byłoby, gdyby cały proces wymagał ode mnie wpisania sudo
hasła, ale tylko raz na samym początku procesu instalacji. Wtedy zapomniałby o tym na samym końcu, ale do tego czasu należy go cały czas utrzymywać (może to potrwać kilka godzin).
Rozwiązania, które znalazłem w Internecie, obejmują:
sudo -v
na początku skryptu, ale jeśli dobrze rozumiem, ten limit czasu. Mój skrypt może działać przez kilka godzin- uruchamianie skryptu za pomocą
sudo
, ale polecenia, które nie wymagają administratorasudo -u $(logname) <command>
. To właśnie robię teraz, ale wydaje się, że powinno być na odwrót.
Idealnie chciałbym, aby mój skrypt:
- poprosić o poświadczenia administratora
- uruchom normalne polecenia jako zalogowany użytkownik
- uruchom polecenia sudo z poświadczeniami wprowadzonymi w kroku 1
sudo -k
aby zamknąć sesję administratora
SUDO_USER
zmienną środowiskową. Jeśli jest obecny, będzie on zawierał nazwę użytkownika wywołującego sudo. Możesz więc (jako root) przeszukać $ SUDO_USER: $ SUDO_GID $ twoje_pliky. Podobnie możesz sprawdzić te zmienne, aby twoje komendy adduser wiedziały, którego użytkownika dodać.su $SUDO_USER -c command
poleceń jako normalny użytkownik.Odpowiedzi:
Ponieważ masz dostęp do sudo, utwórz plik sudoers dla siebie, a następnie usuń go po zakończeniu skryptu:
źródło
Jednym ze sposobów, że nie byłoby generalnie zalecane jest, aby odczytać hasło siebie i wykorzystanie
sudo
„s-S
opcja przekazać hasło jak i gdy są potrzebne:Od
man sudo
:źródło
echo "$password"
??echo "$password"
nie byłoby, ale heredoki i ciągi znaków są nieco bardziej bezpieczne. Nie są widoczne w wierszu poleceń pokazanym przez zwykłe narzędzia.echo "$password"
po lewej stronie rury jest bezpieczny w skrypcie bash.echo
jest wbudowaną powłoką;/bin/echo
nie działa, gdy jest wywoływany tak prostoecho ...
. Niektóre inne muszle mająecho
wbudowane (dash
na przykład), ale muszle w stylu Bourne'a nie są wymagane . Myślę więc, żeecho "$password" |
jest to akceptowalne w bash, ale najlepiej można tego uniknąć, jeśli ktoś przeniesie skrypt do innej powłoki bez zauważenia problemu. Używam nieprzenośnego w tym skrypcie[[
zamiast tego samego problemu. @KasiyA[