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
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 prinsu
. - Î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:
-
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
-
Adăugați câteva comenzi care sunt doar
root
sausudo
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!
) -
Atribuiți permisiunile de executare folosind:
sudo chmod u+x create_dir.sh
-
Efectuați modificări astfel încât acest script să nu necesite o parolă.
-
Deschideți
sudoers
fișier:sudo visudo -f /etc/sudoers
-
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.
-
-
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
dinsudo 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 pecreate_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 pesudo
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ționareasudo
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 însudoers
) 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.
- Creați un script shell unde apelați comanda fără
sudo
. - 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 exempluchmod 755 /usr/local/bin/script_name
). -
Adăugați excepția la sudoeri folosind visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
. -
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.
/path/to/my/program
ar fi un script python?.bashrc
)? Sau chiar un script shell din/usr/local/sbin
? Pentru a încerca./etc
, dar unele sisteme îl pun în altă parte. Dacă nu îl puteți găsi ‘, încercațiman sudoers
. Locația locală a fișierului respectiv trebuie înlocuită cuman
la momentul în care a fost construităsudo
pentru acel sistem.