`/ etc / sudoers` - podać` env_keep` tylko dla jednego polecenia?

23

Czy jest jakiś sposób na określenie, które sudopowinny zachować pewne zmienne środowiskowe tylko dla określonych poleceń? Do niektórych celów chciałbym mojej $HOMEenv. zmienna zachowana po uruchomieniu niektórych poleceń. Do innych celów i innych poleceń chcę go zresetować. Czy można to zrobić /etc/sudoers?

Edytować:

Dziękuję za odpowiedzi. Zastanawiam się, czy mógłbym zadać dalsze pytanie, które brzmi: „Dlaczego więc to nie działa?”.

W przykładzie, który próbuję rozpocząć, chcę sudo nanoprzeczytać mój $HOME/.nanorc. Jeśli użyję tego:

Defaults:simon env_keep=HOME

działa idealnie. Jeśli użyję tego:

Defaults!/bin/nano env_keep=HOME

albo to:

Cmnd_Alias      NANO = /usr/bin/nano,/bin/nano,/bin/rnano
Defaults!NANO   env_keep=HOME

to w ogóle nie działa. Wszelkie sugestie, dlaczego? (Jestem na testach Debiana, btw.)

(Uwaga: nie wydaje mi się, żeby było to nanospecyficzne, btw - mogę odtworzyć zachowanie za pomocą jednowierszowego skryptu bash, który po prostu echos $HOME).

Szymon, Szymek
źródło
1
Zamiast próbować uruchomić nano przez sudo, aby użyć tego samego pliku konfiguracyjnego, użyj sudoeditzamiast tego. sudoedituruchomi skopiuj zawartość pliku do pliku tmp i uruchomi wybrany przez ciebie edytor jako użytkownik, gdy edytor wyjdzie, sprawdzi, czy coś zmieniłeś, a jeśli tak, zamień oryginał na edytowany. Możesz wybrać edytor, który ma być uruchamiany, ustawiając $EDITORzmienne env lub $ VISUAL`.
Arrowmaster
@Arrowmaster - dzięki, to wydaje się lepsze podejście niż to, z którym się bałam. Ponieważ owijam już sudoswoją własną funkcję, po prostu dodałem if [ "$1" == "$EDITOR" ]; thenblok i teraz dzwonię sudoedit:)
simon

Odpowiedzi:

21

Aby zastąpić env_keeptylko dla /path/to/command(wywołanego przez dowolną regułę, przez dowolnego użytkownika) i dla użytkownika joe(bez względu na to, jaką komendę wykonuje):

Defaults!/path/to/command env_keep=HOME
Defaults:joe env_keep=HOME

Możesz użyć -=lub, +=aby usunąć lub dodać wpis do env_keeplisty.

Gilles „SO- przestań być zły”
źródło
świetnie, dziękuję. Nie mogłem znaleźć odpowiedniego przykładu tej składni. Teraz, kiedy to dla mnie przeliterujesz, widzę, jak powinienem to wyjaśnić na manstronie, i czuję się trochę głupio. Bez wątpienia ta odpowiedź pomoże jednak także innym.
simon
1
@simon: Nie czuj się głupi, ja też uważam, że opis składni na sudoersstronie podręcznika jest trudny do wypracowania na podstawie opisu formalnego, a przykłady łatwiej znaleźć, jeśli już wiesz, jak je napisać.
Gilles „SO- przestań być zły”
hmm - może wkrótce rozmawiałem. Teraz, gdy tego próbuję, nie mogę go uruchomić. Czy mogę sprawić, byś spojrzał na moją wersję?
simon
1
@simon: Domyślam się, że masz również wpis, który pozwala ci robić wszystko i nie ma tego env_keepustawienia ( simon ALL = ALL). Sudo używa ostatniego pasującego wpisu.
Gilles „SO- przestań być zły”
Uwaga, jeśli jest ustawiona ścieżka_bezpieczna, konieczne będzie także dodanie Wartości domyślne: joe! Ścieżka_bezpieczna
Jistanidiot
6
Cmnd_Alias      PBUILDER = /usr/sbin/pbuilder,/usr/sbin/cowbuilder
Defaults!PBUILDER       env_keep+=HOME

Linie te są z własną rękę /etc/sudoers, aby rozwiązać ten problem, że pbuilderwygląda w $HOMEjego pliku konfiguracyjnym użytkownika, ale musi być uruchamiany jako root (przesuwając go /roottroche pokonuje celem posiadające zarówno system i plik konfiguracyjny użytkownika).

Arrowmaster
źródło
tak, to bardzo podobny przypadek użycia, o którym myślałem, dzięki!
simon
Czy masz pojęcie, dlaczego przykłady w mojej wersji wydają się nie działać?
simon
@simon sudo jest bardzo wybredny co do kolejności wpisów w swojej konfiguracji, późniejsze wpisy zastąpią poprzednie. W twojej konfiguracji może występować taki konflikt.
Arrowmaster
1

sudoers człowiek:

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller’s environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

Dlatego tak, można to zrobić za pomocą env_reset, env_keepa env_checkw pliku / etc / sudoers.

Paweł Brodacki
źródło