Jak uruchomić określony program jako root bez pytania o hasło?

Muszę uruchomić coś jako sudo bez hasła, więc użyłem visudo i dodałem to do mojego sudoers plik:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program 

Potem wypróbowałem:

$ sudo /path/to/my/program [sudo] password for MYUSERNAME: 

Dlaczego prosi o hasło? Jak mogę uruchamiać / używać poleceń jako root z użytkownikiem innym niż root, bez pytania o hasło?

Odpowiedź

Ty ma inny wpis w pliku sudoers , zwykle znajdującym się pod adresem /etc/sudoers , który pasuje również do Twojego użytkownika. Reguła NOPASSWD musi znajdować się po niej, aby miała pierwszeństwo.

Po wykonaniu tej czynności sudo zapyta o hasło normalnie dla wszystkich poleceń z wyjątkiem /path/to/my/program, które zawsze pozwoli ci uruchomić bez pytania o hasło.

Komentarze

  • czy to nadal działałoby, gdyby /path/to/my/program był skryptem w języku Python?
  • Czy program może zamiast tego być aliasem ustawionym na bash (tj. w .bashrc)? A może nawet skrypt powłoki wewnątrz /usr/local/sbin? Aby spróbować.
  • Nikos – nie, to nie może być alias. Musi wskazywać prawdziwą ścieżkę.
  • sudoers? gdzie jest? Możesz użyć swojej odpowiedzi (
  • @VasiliiSuricov: It ' jest zwykle w /etc, ale niektóre systemy to umieszczają gdzie indziej. Jeśli możesz ' t go znaleźć, spróbuj man sudoers. Lokalną lokalizację tego pliku należy zastąpić w strona w tym czasie sudo została zbudowana dla tego systemu.

Odpowiedź

Jeśli istnieje wiele pasujących wpisów w /etc/sudoers, sudo używa ostatniego. Dlatego jeśli możesz wykonać dowolne polecenie z pytaniem o hasło, i chcesz móc wykonać określone polecenie bez pytania o hasło, wyjątek potrzebny jest na końcu.

myusername ALL = (ALL) ALL myusername ALL = (root) NOPASSWD: /path/to/my/program 

Zwróć uwagę na użycie (root), aby umożliwić uruchamianie programu jako root, ale nie jako inni użytkownicy. (Nie nadawaj więcej uprawnień niż wymagane minimum, chyba że przemyślisz konsekwencje).

Uwaga dotycząca dot aders, którzy nie używają Ubuntu lub którzy zmienili domyślną konfigurację sudo (Ubuntu sudo jest w porządku) : Uruchamianie skryptów powłoki z podwyższonymi uprawnieniami jest ryzykowne, musisz zacząć od czystego środowiska (gdy powłoka została uruchomiona, jest już za późno (zobacz Zezwalaj na setuid w skryptach powłoki ), więc potrzebujesz sudo, aby się tym zająć. Upewnij się, że masz Defaults env_reset w /etc/sudoers lub że ta opcja jest domyślna podczas kompilacji (sudo sudo -V | grep env powinien zawierać Reset the environment to a default set of variables).

Komentarze

  • ex, aby przejść do roota z jhon za pomocą sudo bez podania —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Jeśli chcesz zezwolić na dowolne polecenia jako root, zrób to john ALL=(ALL) NOPASSWD: all. ' nie ma sensu przechodzić przez su.
  • Pytanie: czy powinienem zmieniać uprawnienia mojego skryptu powłoki aby mógł być modyfikowany i odczytywany tylko przez użytkownika root ze względów bezpieczeństwa? Myślę ' o napastniku modyfikującym skrypt, który ma wszystkie przyznane uprawnienia bez konieczności podawania hasła, tak aby robił to, czego chce. Oczywiście osoba atakująca może ' nie czytać pliku sudoers, aby wiedzieć, które skrypty mają to uprawnienie, ale nadal może wypróbować wszystkie moje niestandardowe skrypty, gdy znajdzie folder, w którym się znajdują przechowywane w nadziei, że niektóre są dozwolone lub coś w tym stylu.
  • @JeffreyLebowski Jeśli masz regułę sudo, która uruchamia skrypt (bezpośrednio lub pośrednio), to ' Ważne jest, aby tylko root (lub osoby, które i tak mają uprawnienia roota) mogą zapisywać do pliku skryptu, do katalogu zawierającego plik skryptu, do jego katalogu nadrzędnego i tak dalej. ' nie ma znaczenia, że każdy może odczytać plik skryptu (chyba że zawiera hasło lub coś takiego, ale to ' to zły pomysł, jeśli istnieje ' hasło, powinno ono znajdować się w jego własnym pliku, w przeciwnym razie ' istnieje zbyt duże ryzyko przypadkowego wycieku, np. przez kopiowanie- wklejanie tej sekcji kodu w pytaniu na tej stronie).
  • @alper Nie. Bardzo niewiele rzeczy wymaga ponownego uruchomienia. Po zmianie sudoers nie ' nie musisz robić nic specjalnego: sudo to sprawdza za każdym razem.

Odpowiedź

OSTRZEŻENIE : Ta odpowiedź została uznana za niepewną. Zobacz komentarze poniżej

Kompletne rozwiązanie: Poniższe kroki pomogą Ci uzyskać pożądane wyniki:

  1. Utwórz nowy plik skryptu (zastąp create_dir.sh wybraną nazwą skryptu):

    vim ~/create_dir.sh 

    Skrypt zostanie utworzony w katalogu domowym użytkownika

  2. Dodaj kilka poleceń, które są tylko a root lub sudo użytkownik może wykonać takie czynności, jak tworzenie folderu na poziomie katalogu głównego:

    mkdir /abc 

    Uwaga: Nie dodawaj sudo do tych poleceń. Zapisz i wyjdź (używając :wq!)

  3. Przypisz mu uprawnienia wykonywania, używając:

    sudo chmod u+x create_dir.sh 
  4. Wprowadź zmiany, aby ten skrypt nie wymagał hasła.

    1. Otwórz sudoers plik:

      sudo visudo -f /etc/sudoers 
    2. Dodaj następujący wiersz na końcu:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh 

      Zastąp ahmad dowolną nazwą użytkownika. Upewnij się również, że jest to ostatnia linia. Zapisz i wyjdź.

  5. Teraz podczas uruchamiania polecenia dodaj sudo przed nim, na przykład:

    sudo ./create_dir.sh 

    Spowoduje to uruchomienie poleceń w pliku skryptu bez pytania o hasło.

Postępuj zgodnie z prostymi kroki wymienione tutaj http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Komentarze

  • Byłoby lepiej, gdybyś podał tutaj odpowiednie kroki i użył łącza jako kopii zapasowej w celu uzyskania bardziej szczegółowych informacji. W ten sposób Twoja odpowiedź zachowuje możliwą wartość, nawet jeśli ten link nie byłby już ważny.
  • Ta rada jest niepewna. sudo część sudo chmod u+x create_dir.sh jest niepotrzebna, ponieważ użytkownik ma (prawdopodobnie) własność swojego katalogu domowego. Ponieważ użytkownik może pisać do create_dir.sh, skutecznie dałeś mu wolną powłokę roota.
  • @Lekensteyn Co oznacza również dla każdego programu działającego jako użytkownik . Równie dobrze może po prostu pozwolić użytkownikowi na uruchomienie czegokolwiek z sudo bez hasła.
  • Czy coś mi brakuje? Uważam, że cała chmod jest niepotrzebna, ponieważ polegasz na sudo, aby podnieść swoje uprawnienia.

Odpowiedź

Myślę, że twoja składnia jest nieprawidłowa. Przynajmniej używam następującego, który działa dla mnie:

myusername ALL=(ALL) NOPASSWD: /path/to/executable 

Komentarze

  • (ALL) część jest opcjonalna, pominięcie jej daje dokładnie ten sam efekt. Posiadanie (root) byłoby lepsze, ale jego brak nie ' nie wyjaśnia problemu.
  • +1 dla sudo za to polecenie i nic więcej! Nie ma powodu, aby niszczyć cały system …
  • @Johan: To już było w pytaniu.

Odpowiedz

Jeśli nie chcesz używać sudo ani zmieniać pliku konfiguracyjnego sudoers, możesz użyć:

sudo chown root:root path/to/command/COMMAND_NAME sudo chmod 4775 path/to/command/COMMAND_NAME 

To spowoduje, że polecenie zostanie uruchomione jako root bez potrzeby sudo.

Komentarze

  • Wow, nigdy wcześniej nie słyszałem o tym rozwiązaniu, zadziwiające
  • @RyanNerd: To nie jest bezpieczne rozwiązanie. Nie tylko OP może teraz uruchomić polecenie jako root bez hasła, ale każdy może teraz uruchomić polecenie jako użytkownik root.
  • ” chmod 4775 filename ” jest w jedną stronę. Po drugie, być może lepszym sposobem na SETUID bez ponownego definiowania uprawnień do całego pliku jest ” chmod u + s nazwa_pliku ”
  • sudo chmod 005 jest bezpieczny. Nie ' nie chcesz udzielać uprawnień do zapisu bieżącemu użytkownikowi. W przeciwnym razie każdy w Twojej sesji mógłby zrobić wszystko z Twoim skryptem.

Odpowiedź

Jeśli masz dystrybucję taką jak Manjaro , musisz najpierw zająć się plikiem, który zastępuje definicję / etc / sudoers, możesz go usunąć lub pracować bezpośrednio z tym plikiem, aby dodać nowe konfiguracje.

Ten plik to:

sudo cat /etc/sudoers.d/10-installer 

JEDYNYM sposobem, aby zobaczyć to jest z uprawnieniami roota, bez tego nie możesz wyświetlić tego katalogu, ten plik jest specyficzny dla Manjaro, możesz znaleźć tę konfigurację z inną nazwą , ale w tym samym katalogu.

W wybranym pliku możesz dodać następujące wiersze, aby uzyskać żądane konfiguracje:

Ignoruj uwierzytelnianie dla grupy

%group ALL=(ALL) NOPASSWD: ALL 

lub Ignoruj uwierzytelnianie użytkownika

youruser ALL=(ALL) NOPASSWD: ALL 

lub Ignoruj uwierzytelnianie plik wykonywalny dla określonego użytkownika

youruser ALL=(ALL) NOPASSWD: /path/to/executable 

SZYBKA UWAGA: Otwierasz drzwi, aby korzystać z SUDO bez uwierzytelniania, co oznacza, że możesz uruchomić wszystko, co modyfikuje wszystko w Twoim systemie, używaj tego z odpowiedzialnością.

Odpowiedź

Sprawdź, czy sudo nie ma aliasu. Uruchom w ten sposób

/usr/bin/sudo /path/to/my/program 

Na przykład alias powłoki podobny do tego:

alias sudo="sudo env PATH=$PATH" 

może powodować takie zachowanie.

Komentarze

  • Masz rację, mój komentarz był niesprawny tutaj , przepraszam za to . Niemniej jednak ' jestem zaintrygowany – jak spodziewasz się, że aliasing zmieni przetwarzanie sudoers przez sudo. A może mówisz o przekierowaniu sudo do czegoś, co zawsze wyświetla ten komunikat o błędzie w celu zebrania haseł? Jest to mało prawdopodobne w tym przypadku …
  • Miałem ten sam problem co OP. Okazało się, że przyczyną tego jest alias sudo="sudo env PATH=$PATH" w moim ~/.bashrc. Zamiast rozwiązywać to samodzielnie i na ślepo zajmować się swoim biznesem, przesłałem odpowiedź jako możliwe rozwiązanie dla każdego, kto pojawia się w tym wątku.
  • To ' jest w porządku, ale jeśli nie jest to oczywiste (co w tym przypadku nie jest ' t przynajmniej dla niektórych osób), dobrze jest umieścić wyjaśnienie w odpowiedzi, aby zapewnić jakiś kontekst i uniemożliwić ludziom ślepe używanie magicznych zaklęć. +2 (- (- 1) + +1). 🙂

Odpowiedź

Po wykonaniu skryptu należy go uruchomić jako sudo /path/to/my/script.

Edycja: Na podstawie Twojego komentarza do innej odpowiedzi chcesz uruchomić to za pomocą ikony. Będziesz musiał utworzyć plik .desktop, który będzie wykonywał twój program w sudo, tak jak na terminalu.

Możesz również rozważyć użycie gtk-sudo w celu wyświetlenia monitu o hasło.

Prawdopodobnie powinieneś rozważyć pomysł, że nie powinieneś uruchamiać rzeczy jako root i że zmienianie systemu dalej w dół drogi, abyś nie potrzeba uprawnień roota w ogóle byłaby lepszym sposobem.

Komentarze

  • Nie ustawiaj skryptów powłoki jako setuid . Zobacz Zezwalaj na setuid w skryptach powłoki .
  • Nie chciałem nawet o tym wspominać, ponieważ ' to taka zła opcja. Po prostu go usunąłem, ponieważ ' martwię się, że pytający może skorzystać z porady, nawet z ostrzeżeniem, że to zła rada!

Odpowiedz

To rozwiązało problem (wypróbowałem również inne odpowiedzi, które mogły pomóc):

Skrypt, który dzwoniłem znajdował się w /usr/bin, katalogu, do którego nie mam uprawnień do zapisu (chociaż zwykle mogę tam czytać dowolne pliki). Skrypt był chmodded + x (uprawnienia wykonywalne), ale nadal nie działa. Przenosząc ten plik do ścieżki w moim katalogu domowym, zamiast /usr/bin, w końcu mogłem go wywołać za pomocą sudo bez wpisywania hasła.

Również coś, co wątpił (wyjaśnienie dla przyszłych czytelników): Musisz uruchomić swój skrypt jako sudo. Wpisz sudo podczas wywoływania skryptu. Nie używaj sudo dla polecenia wewnątrz skryptu, które faktycznie wymaga roota (zmiana podświetlenia klawiatury w moim przypadku). Być może to też działa, ale nie musisz tego robić. wydaje się być lepszym rozwiązaniem.

Komentarze

  • Drugi akapit zawiera odpowiedź na mój problem
  • @MuhammadAhmadZafar Cieszę się pomogło!
  • Właściwie użycie sudo wewnątrz skryptu jest całkowicie w porządku, pod warunkiem, że masz odpowiednie prawa (ustawione w sudoers), aby uruchomić dane polecenie bez hasła. To sprawia, że wszystko jest trochę bezpieczniejsze.
  • naprawdę przydałaby się ta odpowiedź napisana ponownie jako krok po kroku ' tak to się robi ' zamiast dialogu z innymi odpowiedziami
  • @WalrustheCat Dobra uwaga. Czytając ponownie swoją odpowiedź, myślę, że sam mogłem być trochę zdezorientowany. Jednak w tej chwili nie ' nie pamiętam dokładnej sytuacji, więc nie mogę ' zrobić lepszego zapisu. Jeśli się zorientujesz, być może kombinacja kilku odpowiedzi, zdecydowanie prześlij nową odpowiedź!

Odpowiedź

Inną możliwością może być instalacja, konfiguracja, a następnie użycie super polecenie, aby uruchomić skrypt jako

super /path/to/your/script 

Jeśli chcesz uruchomić jakiś plik binarny plik wykonywalny (np. Skompilowany do pliku binarnego ELF z jakiegoś kodu źródłowego C) – czyli nie skrypt – jako root możesz rozważyć zrobienie go setuid (a właściwie /bin/login, /usr/bin/sudo i /bin/su i super używają tej techniki). Jednak bądź bardzo ostrożny, możesz otworzyć ogromną lukę w zabezpieczeniach .

Konkretnie, Twój program powinien być zakodowane paranoicznie (więc sprawdź wszystkie argumenty i środowisko oraz warunki zewnętrzne przed ” działaniem „, zakładając potencjalnie wrogi użytkownik), a następnie można ostrożnie używać seteuid (2) i przyjaciół (patrz także setreuid (2) ) ( zobacz także możliwości (7) & dane logowania (7) & execve (2) …)

Będziesz „ll użyj chmod u+s (przeczytaj chmod (1) ) podczas instalowania takiego pliku binarnego.

Ale bądź bardzo ostrożny .

Przeczytaj wiele rzeczy na temat setuid , w tym Advanced Linu x Programowanie , przed zakodowaniem czegoś takiego.

Zwróć uwagę, że skrypt lub dowolny shebang -ed rzecz, której nie można ustawić. Ale możesz napisać (w C) mały plik binarny setuid, opakowując go.

Pamiętaj, że w Linuksie kod aplikacji współdziała z jądrem Linuksa używając syscalls (2) . Większość z nich mogła zawieść, patrz errno (3) . Wiele aplikacji Linuksa (np. GNU bash , GNU make , GNU gdb , GNOME ) to oprogramowanie typu open source: możesz pobierać, a następnie studiować i współtworzyć ich kod źródłowy.

Komentarze

  • Zaawansowane programowanie w Linuksie to martwy link.

Odpowiedź

Najlepiej, jeśli dostosowujesz polecenia, które można uruchamiać za pośrednictwem sudo, powinieneś wprowadzić te zmiany w oddzielnym pliku w /etc/sudoers.d/ zamiast bezpośrednio edytować plik sudoers. Powinieneś także zawsze używać visudo do edycji plików. NIGDY nie należy wydawać NOPASSWD przy poleceniach ALL.

Przykład: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Wstaw swoją linię przyznającą pozwolenie: myuser ALL= NOPASSWD: /path/to/your/program

Następnie zapisz i zakończ i visudo wyświetli ostrzeżenie, jeśli wystąpią jakiekolwiek błędy składniowe.

Możesz uruchomić sudo -l, aby zobaczyć uprawnienia, które przyznano Twojemu użytkownikowi, jeśli którykolwiek z jego Polecenia NOPASSWD pojawiają się PRZED jakimkolwiek %groupyouarein ALL=(ALL) ALL poleceniem w wynikach, zostaniesz poproszony o podanie hasła.

Jeśli znajdziesz sam tworzysz wiele takich plików sudoers.d, być może będziesz chciał utworzyć je nazwane według użytkownika, aby były łatwiejsze do wizualizacji. Należy pamiętać, że kolejność NAZW PLIKÓW i REGUŁ w pliku jest bardzo ważna, OSTATNI załadowany wygrywa, bez względu na to, czy jest WIĘCEJ czy MNIEJ dozwolony niż poprzednie wpisy.

Możesz kontrolować kolejność nazw plików, używając przedrostka 00-99 lub aa / bb / cc, ale pamiętaj również, że jeśli masz JAKIEKOLWIEK pliki, które nie mają prefiksu numerycznego, załaduje się po numerowanych plikach, nadpisując ustawienia. Dzieje się tak, ponieważ w zależności od ustawień języka „sortowanie leksykalne” powłoka najpierw sortuje liczby, a następnie może przeplatać wielkie i małe litery podczas sortowania w porządku „rosnącym”.

Spróbuj uruchomić printf "%s\n" {{0..99},{A-Z},{a-z}} | sort i printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort, aby sprawdzić, czy Twój bieżący język drukuje AaBbCc etc lub ABC, a następnie abc, aby określić najlepszy prefiks „ostatniej” litery do użycia be.

Odpowiedź

Aby umożliwić każdemu użytkownikowi wykonywanie programu jako sudo bez pytania o hasło, możesz dodać następującą linię

%sudo ALL=(root) NOPASSWD: /path/to/your/program

w /etc/sudoers

Zwróć uwagę, że % sudo daje radę.

Komentarze

  • Chociaż ' jest jednym ze sposobów realizacji reguły sudo, to nie ' t odpowiedz na pytanie, dlaczego ustawienie flagi NOPASSWD na tej regule nadal powodowało monit o podanie hasła. Zobacz zaakceptowaną odpowiedź, aby dowiedzieć się, dlaczego tak się stało.

Odpowiedź

Poniżej przedstawiono przypadek, w którym chcesz uruchomić polecenie bez hasła tylko wtedy, gdy ma określony zestaw opcji, gdzie część opcji jest zmienna . AFAIK, nie można używać zmiennych ani zakresów wartości w deklaracjach sudoers, tj. Możesz jawnie zezwolić na dostęp do command option1, ale nie command option2 za pomocą:

user_name ALL=(root) /usr/bin/command option1

ale jeśli struktura to command option1 value1, gdzie value1 może się różnić, musiałbyś mieć wyraźne linie sudoers dla każdej możliwej wartości value1. Skrypt powłoki umożliwia obejście tego problemu.

Ta odpowiedź została zainspirowana odpowiedzią M. Ahmada Zafara i rozwiązuje problem bezpieczeństwa.

  1. Utwórz skrypt powłoki, w którym wywołaj polecenie bez sudo.
  2. Zapisz skrypt w folderze z uprawnieniami roota (np. /usr/local/bin/), plik należący do administratora (np. chown root:wheel /usr/local/bin/script_name) bez prawa zapisu dla innych (np. chmod 755 /usr/local/bin/script_name).
  3. Dodaj wyjątek do sudoers używając visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Uruchom swój skrypt sudo script_name.

Na przykład chcę zmienić limit czasu uśpienia wyświetlacza w systemie macOS. Robi się to za pomocą:

sudo pmset displaysleep time_in_minutes

Uważam, że zmiana limitu czasu uśpienia jest niewinną czynnością, która „nie usprawiedliwia kłopotów z wpisywaniem hasła, ale pmset może robić wiele rzeczy i chciałbym trzymać te inne rzeczy za hasłem sudo.

Mam więc następujące skrypt pod adresem /usr/local/bin/ds:

 #!/bin/bash if [ $# -eq 0 ]; then echo "To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"" else if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then pmset displaysleep $1 else echo "Time must be 0..180, where 0 = never, 1..180 = number of minutes" fi fi  

Na końcu pliku sudoers mam następującą linię:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Aby ustawić limit czasu na 3 minuty, uruchamiam skrypt ze zwykłego konta użytkownika user_name:

sudo ds 3

PS Większość mojego skryptu to sprawdzanie poprawności danych wejściowych, co nie jest obowiązkowe, więc działałoby również następujące:

 #!/bin/bash pmset displaysleep $1  

Odpowiedz

Alternatywnie możesz użyć Pythona opakowanie pudo .

Instalacja:

user$ sudo -H pip3 install pudo # you can install using pip2 also 

Poniżej znajduje się fragment kodu do używania w automatyzacji Pythona do uruchamiania poleceń z uprawnieniami administratora:

user$ python3 # or python2 >>> import pudo >>> (ret, out) = pudo.run(("ls", "/root")) # or pudo.run("ls /root") >>> print(ret) >>> 0 >>> print(out) >>> b"Desktop\nDownloads\nPictures\nMusic\n" 

Poniżej znajduje się przykład cmd do uruchamiania poleceń z uprawnieniami administratora:

user$ pudo ls /root Desktop Downloads Pictures Music 

Odpowiedź

W skrypcie sudoers, który znajduje się w / etc / odkomentuj wiersz podany poniżej:

#includedir /etc/sudoers.d

Utwórz jeden plik o dowolnej nazwie w katalogu /etc/sudoers.d/ i dodaj zawartość podaną w maksymalnej liczbie odpowiedzi. Podobnie jak dla wszystkich użytkowników jako root

#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

Jest to najbezpieczniejszy sposób uruchamiania skryptu z uprawnieniami administratora.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *