Uruchamianie skryptu zawierającego polecenia sudo z sudoers

1

Napisałem skrypt, który pomaga oczyścić moje pliki do pobrania i anime, ale nie będzie działał bez rootowania.

Próbowałem więc dodać go do / etc / sudoers (edytowanego przy użyciu sugestii techraf):

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification


# Cmnd alias specification
Cmnd_Alias FILEPERM_CMDS = /bin/chown, /bin/chmod

# User privilege specification
root    ALL=(ALL:ALL) ALL
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/down.sh
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/rehamer.sh
myUsernane ALL=(ALL) NOPASSWD: /bin/chown
myUsernane ALL=(ALL) NOPASSWD: /bin/chmod
myUsernane ALL=(ALL) NOPASSWD: FILEPERM_CMDS

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d 

Ale to nie działa ...

Oto, co jest w skrypcie:

sudo chown -cR myUsername:users $downloads $anime >>"$default"logs/own.log 2>&1
echo owned
sudo chmod -cR 664 $anime >>"$default"logs/mod.log 2>&1
sudo chmod -cR 765 $downloads >>"$default"logs/mod.log 2>&1
sudo find $downloads $anime -type d -exec chmod a+x {} \; >>"$default"logs/mod.log 2>&1
echo moded
rm -vrf $downloads*.ignore >>"$default"logs/rm.log 2>&1
echo removed ignored files

Jeśli zostawiam sudo w skrypcie, raz prosi o hasło i działa. Jeśli usunę sudo z mojego skryptu, będzie on działał bez promowania hasła, ale wciąż będą Permissions deniedpojawiać się błędy. Jak możesz to naprawić?

hakarune
źródło

Odpowiedzi:

2

Dodając następujące elementy do sudoers:

myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh

Zezwoliłeś myUsernamena uruchamianie /path/to/down.shskryptu z podwyższonymi uprawnieniami. Oznacza to, że możesz wydać następujące polecenie:

sudo /path/to/down.sh

Wystarczy uruchomić cały skrypt z podwyższonymi uprawnieniami i nie prosić o hasło. Nie trzeba umieścić dodatkowy sudodo chownlub chmodjako tych poleceń będą dziedziczyć uprawnienia ze skryptu (ale w tym przypadku sudo chownbędzie działać bez problemów, ponieważ rootma uprawnienia do uruchamiania wszystkich poleceń bez haśle).

To jeden z możliwych sposobów.


Inna droga...

Nie pozwoliłeś myUsernamena uruchomienie chownani chmodna sudoers. Jeśli chcesz uruchomić skrypt jako zwykły użytkownik i zezwolić na uruchamianie tylko niektórych poleceń root, powinieneś określić je wszystkie sudoersna przykład:

myUsername ALL=(ALL) NOPASSWD: /usr/sbin/chown

Twoja ścieżka do plików binarnych może być inna

lub podaj aliasy poleceń:

Cmnd_Alias FILEPERM_CMDS = /usr/sbin/chown, /usr/sbin/chmod
myUsername ALL=(ALL) NOPASSWD: FILEPERM_CMDS

W ten sposób możesz używać swojego skryptu w obecnej postaci.


Wreszcie określiłeś swoje uprawnienia w # User alias specification. To tylko dobra praktyka, ale nie o tym jest ta sekcja. Powinieneś raczej to dodać # User privilege specification.

Spójrz na przykłady sudoers dla niektórych typowych scenariuszy.

techraf
źródło
Nie wydaje się działać. Moje chown i chmod znajdują się w / bin. Próbowałem obu podanych ustawień (umieściłem wszystko we właściwej lokalizacji zgodnie z sugestią), ale nadal występują błędy uprawnień.
hakarune
Działa, jeśli zmienię skrypt b z powrotem na, sudo chmod blah blah blahale następnie poprosi mnie o hasło użytkownika. Użytkownik nie jest sudoerem, ale działa poprawnie jako root. Dlaczego wciąż pyta o hasło, mimo że użytkownik nie miał uprawnień roota oprócz tych poleceń?
hakarune
Przepraszamy, ale komentowanie „próbowałem wszystkiego i to nie działa” nie jest konstruktywne. Nie mam pojęcia, co robisz, chyba że to napiszesz.
techraf
Próbując wszystkiego, umieściłem twoje polecenia w moim pliku sudoer.
hakarune
# Cmnd specyfikacja aliasu Cmnd_Alias ​​FILEPERM_CMDS = / bin / chown, / bin / chmod # Specyfikacja uprawnień użytkownika root ALL = (ALL: ALL) ALL myUsernane ALL = NOPASSWD: / media / 96e60511-62ca-48ba-bccc-9b365bfcc4e5 / Programy / dół .sh myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/rehamer.sh myUsernane ALL = (ALL) NOPASSWD: / bin / chown myUsernane ALL = (ALL) NOPASSWD: / binnaneod ALL = (ALL) NOPASSWD: FILEPERM_CMDS
hakarune
0

Jedną z możliwości jest sam skrypt sudo. Dodaj to do / etc / sudoers:

myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh

Następnie dodaj to na początku skryptu:

#!/bin/bash

# If not already running as root, rerun via sudo
if [ $(id -u) -ne 0 ]; then
    exec sudo "$BASH_SOURCE" "$@"
    exit $? # in case something fails...
fi

Tak długo, jak ścieżka pliku pasuje do wpisu w / etc / sudoers, powinna być w stanie transparentnie uruchomić się ponownie jako root (abyś mógł pominąć sudos w pozostałej części skryptu). Jeśli z jakiegoś powodu nie pasuje, pojawi się sudomonit o hasło.

Gordon Davisson
źródło