Cum să rulați comenzi ca un alt utilizator în scripturile Linux
Publicat: 2022-07-13Desigur, atunci când rulați o comandă sau un script, sistemul o execută ca un proces care a fost lansat de dvs. Dar puteți rula comenzi și scripturi ca alt utilizator.
Procesele au proprietari
Când se execută un program sau un script, Linux creează un proces. Procesul are un proprietar. Proprietarul este fie un alt proces, fie numele unui cont de utilizator dacă o persoană l-a lansat.
Proprietatea unui proces definește unele dintre capacitățile și mediul procesului. În funcție de modul în care a fost lansat procesul, acesta moștenește anumite atribute ale procesului părinte sau ale utilizatorului. Sau, mai strict, procesul pe care utilizatorul l-a folosit pentru a lansa programul care este de obicei un shell.
Rularea unei comenzi sau a unui script ca alt utilizator poate fi utilă deoarece dreptul de proprietate asupra oricăror fișiere care sunt create de proces va aparține utilizatorului corespunzător.
De fiecare dată când folosim sudo
, rulăm o comandă ca alt utilizator. Contul de utilizator implicit folosit de sudo
este utilizatorul root sau „super”. Din această cauză, sudo
este adesea considerat eronat că reprezintă un super utilizator do . Dar asta e doar un jargon slăbit. De fapt, înseamnă utilizator înlocuitor do .
Cu sudo
, puteți rula comenzi ca orice alt utilizator, nu doar ca root. În mod ironic, aveți nevoie de privilegii de root pentru a face acest lucru. Dar lansarea unui program sau script deținut de alt utilizator nu este același lucru cu rularea acelui proces cu acel alt utilizator. Îl vei rula în continuare ca root.
Iată cum să rulați de fapt un proces ca alt utilizator și cum să rulați comenzi dintr-un script ca și cum ar fi fost executate de un alt utilizator.
Rulați un script ca alt utilizator
Folosim un computer care are mai mulți utilizatori configurați. Una este Mary, care are numele de utilizator maryq, iar cealaltă este Dave cu numele de utilizator dave.
Mary are un script numit „other-user.sh” în directorul ei de acasă. Acesta este textul scenariului.
#!/bin/bash echo „Nume script:” $0 echo „Director de lucru:” $(pwd) echo „Scriptul rulează ca utilizator:” $(whoami)
Tipărește numele scriptului, care este păstrat în variabila de mediu $0
. Apoi folosește pwd
pentru a tipări directorul de lucru. În cele din urmă, folosește comanda whoami
pentru a tipări numele utilizatorului care a lansat scriptul. Sau cine crede că a lansat scenariul.
Copiați textul din script într-un editor și salvați-l ca „other-user.sh” în directorul principal al unui alt cont de utilizator.
Va trebui să facem scriptul executabil. Vom folosi comanda chmod
și vom folosi opțiunea +x
(execuție) și opțiunea -u
(utilizator) pentru a seta flagul de execuție numai pentru proprietar. Asta înseamnă că numai Mary poate rula scriptul. Vom verifica permisiunile fișierelor cu ls
.
chmod u+x alt utilizator.sh
ls
De la stânga la dreapta, permisiunile citesc:
- Proprietarul poate citi, scrie și executa fișierul.
- Membrii grupului pot citi și scrie fișierul.
- Alții pot citi doar fișierul.
Deci singurii utilizatori capabili să ruleze scriptul sunt Mary și root. Iată ce se întâmplă când Mary rulează scriptul:
./altul-utilizator.sh
Ni se spune că directorul de lucru curent al scriptului este directorul principal al lui Mary, iar proprietarul scriptului este contul de utilizator maryq.
După cum era de așteptat, Dave nu poate rula scriptul.
/home/maryq/other-user.sh
Dacă Dave are privilegii de utilizator root, el poate încerca să ruleze scriptul ca root, folosind sudo
.
sudo /home/maryq/other-user.sh
Acesta este un succes parțial. Scriptul rulează, dar proprietarul scriptului este root, nu maryq.
Trucul pe care trebuie să îl folosim este opțiunea sudo -u
(utilizator). Aceasta vă permite să specificați utilizatorul cu care doriți să rulați comanda. Dacă nu utilizați opțiunea -u
, sudo
folosește implicit root. Dacă vrem să rulăm comanda ca Mary, trebuie să transmitem numele contului lor de utilizator la comanda sudo
.
sudo -u maryq /home/maryq/other-user.sh
De data aceasta, scriptul raportează că proprietarul procesului este maryq.
Să adăugăm o linie la scriptul „other-user.sh”. Vom echo
ceva text și vom redirecționa rezultatul într-un fișier numit „mary.txt”.
#!/bin/bash echo „Nume script:” $0 echo „Director de lucru:” $(pwd) echo „Scriptul rulează ca utilizator:” $(whoami) echo „Acesta va intra într-un fișier în /home/maryq/” > /home/maryq/mary.txt
Creăm noul fișier în directorul principal al lui Mary. Acest lucru este perfect pentru că rulăm scenariul ca Mary.
./altul-utilizator.sh
Dacă verificăm în directorul principal al lui Mary, vom vedea că fișierul a fost creat, iar dreptul de proprietate asupra fișierului aparține contului de utilizator maryq.
ls -hl mary.txt
Acesta este același comportament pe care l-am vedea dacă Mary ar fi lansat chiar ea scenariul.
LEGATE: Cum să utilizați comanda chmod pe Linux
Comanda runuser
Puteți folosi comenzile sudo -u
pe care le-am folosit până acum în interiorul unui script, dar există o altă comandă, runuser
, care este concepută pentru a rula procese ca un utilizator diferit de scripturile din interior. Are o gestionare mai bună a codului de returnare din procesul lansat și are mai puține cheltuieli generale decât sudo
.
Comanda runuser
trebuie să fie rulată de rădăcină, dar acest lucru se realizează prin rularea întregului script ca rădăcină. Nu trebuie să utilizați sudo
în interiorul scriptului. Comanda runuser
poate fi folosită și pe linia de comandă, deci nu este limitată la utilizarea scripturilor, deși este metoda preferată pentru scripturi.
Dave nu poate lista fișierul „mary.txt” deoarece se află în directorul principal al lui Mary și nu are acces.
pisică /home/maryq/mary.txt
Cu toate acestea, putem arunca o privire în interiorul fișierului folosind runuser
. Opțiunea -
(login) lansează un nou shell cu un mediu foarte apropiat de mediul shell pe care l-ar avea Mary dacă s-ar fi conectat efectiv. Opțiunea -c
(comandă) este urmată de comanda pe care vrem să o rulăm.
sudo runuser - maryq -c 'cat mary.txt'
Rețineți că comanda nu are nevoie de calea completă către fișier. Putem face referire la fișier în același mod în care ar face Mary, în raport cu directorul ei de acasă.
În calitate de utilizator Dave, vom crea un script numit „run-maryq.sh” cu acest text în el:
#!/bin/bash runuser -l maryq -c 'cat mary.txt'
Îl vom face executabil:
chmod +x run-maryq.sh
Să vedem ce se întâmplă când încercăm să-l rulăm.
./run-maryq.sh
Comanda runuser
se plânge deoarece este executată de un utilizator obișnuit. Să-l rulăm din nou cu sudo
.
sudo ./run-maryq.sh
Funcționează așa cum ne-am dori și ca și cum Mary ar fi lansat ea însăși scenariul.
Pe care să folosiți?
Pe linia de comandă, nu există prea multe de ales între ele. Dar, deoarece oricum trebuie să utilizați sudo
cu runuser
, ați putea la fel de bine să utilizați sudo
singur.
Dar într-un script, runuser
este comanda preferată.
LEGATE: 10 comenzi de bază Linux pentru începători