Cum se execută un anumit program ca root fără o solicitare de parolă?

Am nevoie să rulez ceva ca sudo fără parolă, așa că am folosit visudo și am adăugat acest lucru la sudoers fișier:

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

Apoi l-am încercat:

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

De ce solicită o parolă? Cum pot rula / folosi comenzi ca root cu un utilizator non-root, fără să cer o parolă?

Răspunde

Tu aveți o altă intrare în fișierul sudoers , situat de obicei la /etc/sudoers , care se potrivește și cu utilizatorul dvs. Regula NOPASSWD trebuie să fie după aceea pentru ca aceasta să aibă prioritate.

După ce ați făcut acest lucru, sudo vă va solicita o parolă în mod normal pentru toate comenzile, cu excepția /path/to/my/program, care vă va permite întotdeauna să rulați fără să vă cereți parola.

Comentarii

  • ar funcționa în continuare dacă /path/to/my/program ar fi un script python?
  • Poate programul în loc să fie un alias, setat pentru bash (adică în .bashrc)? Sau chiar un script shell din /usr/local/sbin? Pentru a încerca.
  • Nikos – nu, nu poate fi un alias. Trebuie să indice o cale reală.
  • sudoers? unde este? greu de folosit răspunsul dvs. (
  • @VasiliiSuricov: ‘ este de obicei în /etc, dar unele sisteme îl pun în altă parte. Dacă nu îl puteți găsi ‘, încercați man sudoers. Locația locală a fișierului respectiv trebuie înlocuită cu man la momentul în care a fost construită sudo pentru acel sistem.

Răspuns

Dacă există mai multe intrări de potrivire în /etc/sudoers, sudo îl folosește pe ultimul. Prin urmare, dacă puteți executa orice comandă cu un prompt de parolă, și doriți să puteți executa o anumită comandă fără o solicitare de parolă, aveți nevoie de excepția ultima.

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

Rețineți utilizarea (root), pentru a permite executarea programului ca root, dar nu ca alți utilizatori. (Nu acordați mai multe permisiuni decât minimul necesar, cu excepția cazului în care ați gândit implicațiile.)

Notă pentru re aders care nu rulează Ubuntu sau care au modificat configurația sudo implicită (sudo-ul Ubuntu este ok în mod implicit) : Rularea scripturilor shell cu privilegii ridicate este riscantă, trebuie să porniți dintr-un mediu curat (odată ce shell a început, este prea târziu (consultați Permiteți setuid pe scripturile shell ), deci aveți nevoie de sudo pentru a vă ocupa de asta). Asigurați-vă că aveți Defaults env_reset în /etc/sudoers sau că această opțiune este valoarea implicită în timp de compilare (sudo sudo -V | grep env ar trebui să includă Reset the environment to a default set of variables).

Comentarii

  • ex pentru a merge la root din jhon cu sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Dacă doriți să permiteți comenzi arbitrare ca rădăcină, faceți ca john ALL=(ALL) NOPASSWD: all. ‘ nu are rost să mergi prin su.
  • Întrebare: ar trebui să modific permisiunile scriptului meu shell astfel încât să poată fi modificat și citit doar de utilizatorul root, din motive de securitate? Mă ‘ mă gândesc la un atacator care modifică scriptul, care are toate permisiunile acordate fără a fi nevoie de o parolă, astfel încât să facă ceea ce el / ea dorește. Evident, atacatorul nu poate ‘ chiar citi fișierul sudoers pentru a ști ce scripturi au acest privilegiu, dar poate încerca totuși cu toate scripturile mele personalizate odată ce el / ea găsește folderul în care sunt stocate în speranță că unele sunt permise sau ceva de genul acesta.
  • @JeffreyLebowski Dacă aveți o regulă sudo care rulează scriptul (direct sau indirect), atunci ‘ Este vital ca numai root (sau persoanele care oricum au privilegii de root) să poată scrie în fișierul script și în directorul care conține fișierul script, și în directorul părinte al acestuia și așa mai departe. Nu contează că ‘ nu contează că oricine poate citi fișierul script (cu excepția cazului în care conține o parolă sau altceva, dar că ‘ este o idee proastă, dacă există ‘ o parolă ar trebui să fie în propriul fișier, altfel există ‘ un risc prea mare de scurgere accidentală, de ex., prin copiere- lipirea acelei secțiuni a codului într-o întrebare de pe acest site).
  • @alper Nu. Foarte puține lucruri necesită repornirea. După ce ați schimbat sudoers, nu ‘ nu trebuie să faceți nimic special: sudo îl verifică de fiecare data.

Răspuns

AVERTISMENT : Acest răspuns a fost considerat nesigur. Vedeți comentariile de mai jos

Soluție completă: Următorii pași vă vor ajuta să obțineți rezultatul dorit:

  1. Creați un fișier script nou (înlocuiți create_dir.sh cu numele scriptului dorit):

    vim ~/create_dir.sh 

    Scriptul va fi creat în directorul de pornire al utilizatorului

  2. Adăugați câteva comenzi care sunt doar root sau sudo utilizatorul poate executa ca și cum ar crea un folder la nivelul directorului rădăcină:

    mkdir /abc 

    Notă: Nu adăugați sudo la aceste comenzi. Salvați și ieșiți (utilizând :wq!)

  3. Atribuiți permisiunile de executare folosind:

    sudo chmod u+x create_dir.sh 
  4. Efectuați modificări astfel încât acest script să nu necesite o parolă.

    1. Deschideți sudoers fișier:

      sudo visudo -f /etc/sudoers 
    2. Adăugați următoarea linie la sfârșit:

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

      Înlocuiți ahmad cu oricare ar fi numele dvs. de utilizator. De asemenea, asigurați-vă că acesta este ultimul rând. Salvați și ieșiți.

  5. Acum, când executați comanda, adăugați sudo înainte ca:

    sudo ./create_dir.sh 

    Aceasta va rula comenzile din fișierul script fără a cere o parolă.

Urmați ușor pașii menționați aici http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Comentarii

  • Ar fi mai bine dacă ați furniza pașii relevanți aici și ați folosi linkul ca o copie de rezervă pentru informații mai detaliate. În acest fel, răspunsul dvs. păstrează valoarea posibilă, chiar dacă acel link nu ar mai fi valid.
  • Acest sfat este nesigur. Partea sudo din sudo chmod u+x create_dir.sh nu este necesară, deoarece utilizatorul are (probabil) dreptul de proprietate asupra directorului său de acasă. Deoarece utilizatorul poate scrie pe create_dir.sh, ați dat efectiv un shell root gratuit utilizatorului respectiv.
  • @Lekensteyn Ceea ce înseamnă și pentru orice program care rulează ca utilizator . Ar putea la fel de bine să permiteți utilizatorului să ruleze orice cu sudo fără o parolă.
  • Îmi lipsește ceva? Cred că întregul chmod nu este necesar, deoarece vă bazați pe sudo pentru a vă ridica privilegiile.

Răspuns

Cred că sintaxa dvs. este greșită. Cel puțin folosesc următoarele care funcționează pentru mine:

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

Comentarii

  • (ALL) partea este opțională, lăsând-o afară are exact același efect. A avea (root) ar fi totuși mai bun, însă absența sa nu ‘ nu explică problema.
  • +1 pentru sudo pentru această comandă și nimic altceva! Niciun motiv pentru a sparge întregul sistem …
  • @Johan: Asta era deja în întrebare.

Răspuns

Dacă doriți să evitați să utilizați sudo și nu trebuie să modificați fișierul de configurare sudoers, puteți utiliza:

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

va face comanda să ruleze ca root fără să fie nevoie de sudo.

Comentarii

  • Uau, nu am mai auzit de această soluție înainte, minte
  • @RyanNerd: Aceasta nu este o soluție sigură. OP nu numai că poate rula acum comanda ca root fără o parolă, dar cumpărați oricine poate rula acum comanda ca utilizator root.
  • ” chmod 4775 nume de fișier ” este o modalitate. În al doilea rând, poate o modalitate mai bună de a SETUID , fără redefinirea permisiunilor întregului fișier este ” chmod u + s filename ”
  • sudo chmod 005 este sigur. Nu ‘ nu doriți să acordați permisiuni de scriere utilizatorului curent. În caz contrar, oricine din sesiunea dvs. ar putea face orice cu scriptul dvs.

Răspundeți

Dacă aveți o distribuție precum Manjaro , trebuie să vă ocupați mai întâi de un fișier care suprascrie definiția / etc / sudoers, îl puteți șterge sau puteți lucra direct cu acel fișier pentru a adăuga noile configurații.

Acest fișier este:

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

Singurul mod de a-l vedea este sub privilegii root, nu puteți lista acest director fără acesta, acest fișier este specific Manjaro, puteți găsi această configurație cu alt nume , dar în același director.

În fișierul ales, puteți adăuga următoarele rânduri pentru a obține configurațiile dorite:

Ignorați autentificarea pentru un grup

%group ALL=(ALL) NOPASSWD: ALL 

sau Ignoră autentificarea pentru un utilizator

youruser ALL=(ALL) NOPASSWD: ALL 

sau Ignoră autentificarea un executabil pentru un anumit utilizator

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

NOTĂ RAPIDĂ: Deschideți o ușă pentru a utiliza SUDO fără autentificare, ceea ce înseamnă că puteți rula totul modificând totul din sistemul dvs., utilizați-l cu responsabilitate.

Răspuns

Verificați dacă sudo nu este aliased. Rulați astfel

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

De exemplu, un alias de shell ca acesta:

alias sudo="sudo env PATH=$PATH" 

poate provoca acest comportament.

Comentarii

  • Ai dreptate, comentariul meu nu a funcționat aici , îmi pare rău pentru asta . Cu toate acestea, ‘ m-am intrigat – cum vă așteptați ca aliasing să schimbe procesarea sudoers de sudo. Sau vorbiți despre redirecționarea sudo către ceva care imprimă întotdeauna acest mesaj de eroare pentru a scoate parolele? Este puțin probabil cazul aici …
  • Aveam aceeași problemă ca PO. S-a dovedit a fi cauzat de faptul că am alias sudo="sudo env PATH=$PATH" în ~/.bashrc. Mai degrabă decât să-l rezolv singur și să mă ocup orbește de afacerea mea, am trimis răspunsul meu ca o posibilă soluție pentru oricine altcineva care vine de-a lungul acestui fir.
  • Că ‘ e în regulă, dar atunci când nu este evident (ceea ce în acest caz nu este ‘ t cel puțin pentru unii oameni) este bine să puneți o explicație în răspuns pentru a oferi un anumit context și împiedică oamenii să folosească orbește descântece magice. +2 (- (- 1) + +1). 🙂

Răspuns

Când executați scriptul, trebuie să îl rulați ca sudo /path/to/my/script.

Editați: Pe baza comentariului dvs. la un alt răspuns, doriți să executați acest lucru de pe o pictogramă. Va trebui să creați un fișier .desktop care execută programul cu sudo, la fel ca pe terminal.

De asemenea, ați putea lua în considerare utilizarea gtk-sudo pentru o solicitare de parolă vizuală.

Probabil ar trebui să luați în considerare ideea că nu ar trebui să rulați lucrurile ca root și că schimbarea sistemului mai departe pe drum, astfel încât să nu” nevoie de permisiuni root ar fi o modalitate mai bună de parcurs.

Comentarii

  • Nu creați scripturi shell setuid . Vedeți Permiteți setuid pe scripturile shell .
  • Am considerat că nici măcar nu-l menționez, deoarece ‘ este o opțiune atât de proastă. Tocmai l-am șters pentru că ‘ mă tem că acest solicitant ar putea folosi sfatul chiar și cu avertismentul că este un sfat rău!

Răspuns

Acest lucru a rezolvat problema pentru mine (am încercat și câteva dintre celelalte răspunsuri, care ar fi putut ajuta):

Scriptul pe care îl apelam era în /usr/bin, un director căruia nu am permisiuni de scriere (deși pot citi de obicei orice fișiere acolo). Scriptul a fost chmodded + x (permisiunea executabilă), dar încă nu a funcționat. Mutând acest fișier pe o cale din directorul meu de acasă, în loc de /usr/bin, am reușit în cele din urmă să-l apelez cu sudo fără a introduce o parolă.

îndoit (clarificând pentru viitorii cititori): trebuie să rulați scriptul ca sudo. Tastați sudo când apelați scriptul. Nu folosiți sudo pentru comanda din scriptul dvs. care are nevoie de rădăcină (schimbarea luminii de fundal a tastaturii în cazul meu). Poate că și asta funcționează, dar nu este necesar, și este pare să nu fie o soluție mai bună.

Comentarii

  • Al doilea paragraf a avut răspunsul la problema mea
  • @MuhammadAhmadZafar Glad a ajutat!
  • De fapt, utilizarea sudo în interiorul unui script este perfect, cu condiția să aveți drepturile corespunzătoare (setate în sudoers) pentru a rula comanda în cauză fără o parolă. Face lucrurile puțin mai sigure.
  • ar putea folosi cu adevărat acest răspuns rescris ca pas cu pas ‘ așa o faci ‘ mai degrabă decât ca un dialog cu celelalte răspunsuri
  • @WalrustheCat Bun punct. Recitind răspunsul meu, cred că aș fi putut fi confundat puțin eu însumi. Totuși, chiar acum, nu îmi amintesc care a fost situația exactă, așa că nu pot ‘ să fac o scriere mai bună. Dacă vă dați seama, poate o combinație de mai multe răspunsuri, trimiteți cu siguranță un răspuns nou!

Răspuns

O altă posibilitate ar putea fi instalarea, configurarea, apoi utilizarea super comanda pentru a rula scriptul ca

super /path/to/your/script 

Dacă doriți să rulați niște executabil (de exemplu, că ați compilat în binar ELF dintr-un cod sursă C) -care este nu un script – ca root, s-ar putea luați în considerare crearea acestuia setuid (și de fapt /bin/login, /usr/bin/sudo și /bin/su și super folosesc toți această tehnică). Cu toate acestea, fiți foarte atenți, puteți deschide o gaură imensă de securitate .

Concret, programul dvs. ar trebui să fie codat paranoic (deci verificați toate argumentele și mediul și condițiile exterioare înainte ca ” să acționeze „, presupunând un utilizator potențial ostil), atunci ar putea folosi seteuid (2) și prieteni (vezi și setreuid (2) ) cu atenție ( vezi și capacități (7) & acreditări (7) & execve (2) …)

Vei ” utilizați chmod u+s (citiți chmod (1) ) când instalați un astfel de binar.

fii foarte atent .

Citește multe lucruri despre setuid , inclusiv Advanced Linu x Programare , înainte de a codifica așa ceva.

Observați că un script sau orice shebang lucru, nu poate fi setuid. Dar ați putea codifica (în C) un setuid-binar mic înfășurându-l.

Rețineți că pe Linux, codul aplicației interacționează cu kernel-ul Linux folosind syscalls (2) . Majoritatea dintre ei ar putea eșua, vezi errno (3) . O mulțime de aplicații Linux (de ex. GNU bash , make GNU , GNU gdb , GNOME ) sunt open source: aveți permisiunea să descărcați apoi să studiați și să contribuiți la codul lor sursă.

Comentarii

  • Programarea Linux avansată este un link mort.

Răspuns

În mod ideal, dacă personalizați ce comenzi pot fi executate prin sudo ar trebui să faceți aceste modificări într-un fișier separat sub /etc/sudoers.d/ în loc să editați direct fișierul sudoers. De asemenea, ar trebui să utilizați întotdeauna visudo pentru a edita fișierele. Nu ar trebui să acordați NICIODATĂ NOPASSWD pentru comenzile ALL.

Exemplu: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Introduceți permisiunea de acordare a liniei: myuser ALL= NOPASSWD: /path/to/your/program

Apoi salvați și ieșiți și visudo vă va avertiza dacă aveți erori de sintaxă.

Puteți rula sudo -l pentru a vedea permisiunile care i-au fost acordate utilizatorului dvs., dacă vreunul dintre utilizatorii specifici Comenzile NOPASSWD apar ÎNAINTE de orice comandă %groupyouarein ALL=(ALL) ALL din ieșire vi se va solicita parola.

Dacă găsiți creați singuri o mulțime de aceste fișiere sudoers.d, atunci poate că veți dori să le creați numite pentru fiecare utilizator, astfel încât să fie mai ușor de vizualizat. Rețineți că ordonarea NUMELULUI DE FIȘIERE și a REGULILOR din fișier este foarte importantă, CÂLTIMUL încărcat câștigă, indiferent dacă este MAI MULȚI sau MAI MIC permisiv decât intrările anterioare. >

Puteți controla ordinea numelui fișierului utilizând un prefix 00-99 sau aa / bb / cc, deși rețineți că, dacă aveți ORICE fișiere care nu au prefix numeric, ele se va încărca după fișierele numerotate, suprascriind setările. Acest lucru se datorează faptului că, în funcție de setările de limbă, „sortarea lexicală”, shell-ul folosește mai întâi numerele de sortare și apoi poate intercala majuscule și minuscule atunci când sortează în ordine „crescătoare”.

Încercați să rulați printf "%s\n" {{0..99},{A-Z},{a-z}} | sort și printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort pentru a vedea dacă limba dvs. curentă imprimă AaBbCc etc sau ABC apoi abc pentru a determina care ar fi cel mai bun „ultim” prefix de literă de utilizat fi.

Răspuns

Pentru a permite oricărui utilizator să execute programul ca sudo fără să solicite parola, puteți adăuga următoarea linie

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

în /etc/sudoers

Rețineți că % sudo îl face.

Comentarii

  • În timp ce ‘ este un mod de a realiza o regulă sudo, nu ‘ t răspunde la întrebarea despre motivul pentru care setarea semnalizatorului NOPASSWD pe această regulă a condus în continuare la o solicitare a parolei. Consultați răspunsul acceptat pentru o idee de ce s-a întâmplat.

Răspuns

Următorul este cazul în care doresc să să execute o comandă fără parolă numai dacă are un set specific de opțiuni, unde o parte a opțiunilor este variabilă . AFAIK nu este posibil să utilizați variabile sau intervale de valori în declarațiile sudoers, adică puteți permite accesul explicit la command option1, dar nu command option2 folosind:

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

dar dacă structura este command option1 value1, unde value1 poate varia, ar trebui să aveți linii sudoer explicite pentru fiecare valoare posibilă a value1. Scriptul Shell oferă o modalitate de a-l înconjura.

Acest răspuns a fost inspirat de răspunsul lui M. Ahmad Zafar și remediază problema de securitate acolo.

  1. Creați un script shell unde apelați comanda fără sudo.
  2. Salvați scriptul într-un folder privilegiat de rădăcină (de ex. /usr/local/bin/), faceți fișierul deținut de rădăcină (de ex. chown root:wheel /usr/local/bin/script_name) fără acces la scriere pentru alții (de exemplu chmod 755 /usr/local/bin/script_name).
  3. Adăugați excepția la sudoeri folosind visudo:

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

  4. Rulați scriptul sudo script_name.

De exemplu, vreau să modific timpul de expirare a somnului pe macOS. Acest lucru se face folosind:

sudo pmset displaysleep time_in_minutes

Consider că modificarea timpului de repaus este o acțiune inocentă care nu justifică hassle-ul introducerii parolei, dar pmset poate face multe lucruri și aș vrea să păstrez aceste alte lucruri în spatele parolei sudo.

Deci am următoarele script la /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  

La sfârșitul fișierului sudoers am următoarea linie:

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

Pentru a seta expirarea la 3 minute, îmi execut scriptul din contul de utilizator obișnuit user_name:

sudo ds 3

PS Majoritatea scriptului meu este validarea intrărilor, care nu este obligatorie, deci ar funcționa și următoarele:

 #!/bin/bash pmset displaysleep $1  

Răspuns

Alternativ puteți utiliza python pachet pudo .

Instalare:

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

Mai jos este fragmentul de cod pentru utilizarea în automatizarea python pentru executarea comenzilor sub privilegiul root:

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" 

Mai jos este exemplul cmd pentru executarea comenzilor sub privilegiul root:

user$ pudo ls /root Desktop Downloads Pictures Music 

Răspuns

În scriptul sudoers care se află în / etc / uncomment linia dată mai jos:

#includedir /etc/sudoers.d

Creați un fișier cu orice nume din directorul /etc/sudoers.d/ și adăugați conținutul așa cum este dat în răspunsurile maxime. Ca pentru toți utilizatorii ca root

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

Acesta este cel mai sigur mod de a rula scriptul cu permisiunea root.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *