Mam długi i długotrwały skrypt bashowy, w którym garść poleceń musi być uruchamiana jako root, podczas gdy większość poleceń musi być uruchamiana jako zwykły użytkownik przed sudo, ponieważ może to zepsuć własność pliku i tym podobne.
Wymyśliłem kilka metod, ale każda z nich ma pewne problemy
Metoda 1: Używanie sudo w pliku
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Wyglądałoby to dobrze ze sposobu pisania kodu. sudo
jest napisane przed kilkoma instrukcjami, które faktycznie muszą być uruchamiane przez root, ale jeśli czas między kolejnymi sudo
wywołaniami jest zbyt długi, sudo
ponownie prosi o hasło. Ponadto, jeśli pierwsze wykonanie sudo
nie powiedzie się, np. Z powodu niepoprawnego hasła, reszta skryptu jest nadal wykonywana.
Metoda 2: użycie sudo do wywołania pliku, a następnie w razie potrzeby powrót do pierwotnego użytkownika
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
To też jest do bani, ponieważ muszę dodać su username -c
przed prawie każdą linią. Znalezienie oryginalnej nazwy użytkownika po sudo
jest również możliwe, ale uciążliwe.
Czy jest lepszy sposób?
Edycja: zamieściłem tu tylko małe, bezsensowne skrypty, aby pokazać, o czym mówię. W rzeczywistym skrypcie mam kilka wierszy, które wymagają sudo (usługi uruchamiania i zatrzymywania), niektóre wiersze, w których nie ma znaczenia, czy jest sudo i całkiem sporo wierszy, które naprawdę trzeba uruchomić bez sudo.
sudo
jeśli musi on mieć podwyższone uprawnienia. Ale nie ma sensu przestawiać sięsu username -c
na uruchomienieecho
. Innymi słowy, brzmi to jak [XY]. Czy mógłbyś edytować i wyjaśnić, co faktycznie zrobi twój skrypt i dlaczego uważasz, że musisz tak często zmieniać użytkowników?man sudo
?-v, --validate
„Zaktualizuj dane użytkownika w pamięci podręcznej, w razie potrzeby uwierzytelniając użytkownika. W przypadku wtyczki sudoers wydłuża to domyślnie limit czasu sudo o kolejne 15 minut, ale nie uruchamia polecenia. Nie wszystkie zasady bezpieczeństwa obsługują buforowane poświadczenia. ” (Jeśli uruchamiasz go wystarczająco często, uwierzytelnianie sudo nie powinnoOdpowiedzi:
Jeśli chodzi o metodę 2, łatwiej jest użyć funkcji. Na przykład:
$SUDO_USER
to nazwa użytkownika sudoera. Możesz również użyć$(logname)
na jego miejscu.Uruchomiony na moim komputerze:
źródło
Czytając
man sudoers
, widać:W ten sposób można zezwolić
regular
namachine1
uruchamianie na hościecommand1
icommand2
jako root, bez uwierzytelniania hasłem za pomocą:ale przeczytaj każdy ze
man -k sudo
szczegółów.źródło
Może to może pomóc:
chmod 775 yourscript.sh
Następnie możesz używać sudo wewnątrz skryptu (bez pytania o hasło) I nie możesz używać sudo do innych poleceń w skrypcie.
źródło
chmod 775
pozwala tylko na wykonanie pliku i nie zmienia użytkownika wykonującego plik ani jego uprawnień.