Mam skrypt, który wykonuje trzy funkcje: A && B && C
.
Funkcja B
musi być uruchomiony jako super-użytkownika, podczas A
i C
nie.
Mam kilka rozwiązań, ale żadne z nich nie jest satysfakcjonujące:
sudo cały skrypt:
sudo 'A && B && C'
To wydaje się złym pomysłem do uruchomienia
A
iC
jako superużytkownik, jeśli nie jest potrzebneuczyń skrypt interaktywnym:
A && sudo B && C
Być może będę musiał wpisać hasło, ale chcę, aby mój skrypt nie był interaktywny, ponieważ każda funkcja może zająć trochę czasu i nie chcę, aby skrypt na mnie czekał. Właśnie dlatego jest to przede wszystkim skrypt, więc nie muszę go oglądać.
Głupie rozwiązanie:
sudo : && A && sudo -n B && C
Po pierwsze, wydaje się głupotą, aby najpierw uruchomić no-op
sudo
, a także muszę kciuka, że A nie zajmie więcej niż$sudo_timeout
.Hipotetyczne rozwiązanie (chciałbym, żebyś mi powiedział, że istnieje):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
Spowodowałoby to podanie mojego hasła na początku, a następnie użycie tych poświadczeń tylko w razie potrzeby.
Jakie jest twoje zdanie na ten temat? Byłbym bardzo zaskoczony, że nie ma rozwiązania tego problemu, ponieważ uważam, że jest to dość powszechny problem (co z tym make all && sudo make install
)
źródło
A
i . Brak problemów z przekroczeniem limitu czasu i brak uprawnień dla A i C. Nie sądzę, że 4 jest możliwe, wydaje się „globalnym stanem” dla użytkownika.C
su -l some_non_priviliged_user
sudo
Odpowiedzi:
Myślę, że najlepszą rzeczą, jaką możesz zrobić, jest uruchomienie skryptu,
sudo
a następnie uruchomienie procesów, które chcesz uruchomić jako zwykły użytkownik, jawnie za pomocąsu user
lubsudo -u user
:źródło
Dodaj skrypt do
/etc/sudoers
pliku zNOPASSWD
atrybutem, aby zezwolić na uruchomienie bez pytania o hasło. Możesz powiązać to z konkretnym użytkownikiem (lub zestawem użytkowników) lub zezwolić na uruchamianie gosudo
przez każdego w twoim systemie.Przykładowa linia skryptu o nazwie
/usr/local/bin/bossy
może wyglądać mniej więcej takI wtedy użyłbyś czegoś takiego
W tym przykładzie założyłem, że
PATH
obejmuje/usr/local/bin
. Jeśli nie, skorzystaj z pełnej ścieżki do skryptu, tjsudo /usr/local/bin/bossy
źródło
Możesz skorzystać z
!requiretty
opcji w,sudo
jak również zNOPASSWD
opcji. Pamiętaj jednak, że zmniejsza to bezpieczeństwo.źródło
/etc/sudoers
wejściem dla użytkownika do wykonania poleceniaB
zeNOPASSWD
jest prawidłowa odpowiedź.Opierając się na mojej odpowiedzi na wstępne autoryzowanie sudo? (Aby można go było uruchomić później) , napisz dwa skrypty:
ABC_script
:B_script
:Uruchom
./ABC_script
:sudo -b ./B_script
. To prosi o hasło ( natychmiast po uruchomieniuABC_script
). Zakładając, że prawidłowe hasło nie zostanie wprowadzone, ikraB_script
w b ackground (ponieważ-b
został określony) jako root. To wydaje się być równoważne zsudo sh -c "./B_script &"
.B_script
zaczyna działać asynchronicznie, równolegle zABC_script
.B_script
sprawdza istnienie pliku o nazwieA_is_done
i zapętla się, aż się pojawi.ABC_script
działaA
. Jeśli / kiedyA
zakończy się pomyślnie, skrypt tworzy plik o nazwieA_is_done
.ABC_script
następnie sprawdza istnienie pliku o nazwieB_is_done
i zapętla się, aż się pojawi.B_script
wykrywa istnienieA_is_done
i przerywa pętlę. UsuwaA_is_done
plik i uruchamia sięB
. Pamiętaj, żeB_script
działa jako root, więc działaB
jako root. Jeśli / kiedyB
zakończy się pomyślnie, skrypt tworzy plik o nazwieB_is_done
i kończy działanie.ABC_script
wykrywa istnienieB_is_done
i przerywa pętlę. UsuwaB_is_done
plik. Pamiętaj, żeB_script
działał jako root, więcB_is_done
jest własnością root, a chcesz go użyć,rm -f
aby uniknąć żądania potwierdzenia.ABC_script
następnie biegnieC
i wychodzi.Uwagi do dalszego udoskonalenia:
ABC_script
powinienB_script
raczej przebiegać bezwzględną ścieżką niż./
.A_is_done
iB_is_done
,ABC_script
prawdopodobnie powinien generować losowe, niepowtarzalne nazwy plików.Musi istnieć przepis przewidujący, że skrypt oczekujący na spin zostanie powiadomiony, jeśli program, na który czeka, zakończył się, ale nie powiódł. (W tej chwili, jeśli się
A
nie powiedzie, oba skrypty przechodzą w nieskończoną pętlę oczekiwania.) Może to być tak proste, jak zmianado
a następnie modyfikacja spin-czeka, aby odczytać
X_is_done
pliki, i kontynuuj, jeśli zawiera 0, i wyjdź w przeciwnym razie.źródło
Milczeć. użyj wielu linii.
źródło
&&
A && sudo B && C
. Tak jak wyjaśnia Antoine w pytaniu; nie prosi o podanie hasła, dopóki sięA
nie skończy, i nie chce na to czekać ani czekać na skrypt.