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.
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 powinno
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?