Cum să rulați comenzi ca un alt utilizator în scripturile Linux

Publicat: 2022-07-13
Terminal Linux pe un laptop pe fundal albastru.
fatmawati achmad zaenuri/Shutterstock.com

Desigur, 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.

Cum să gestionați procesele de la terminalul Linux: 10 comenzi pe care trebuie să le cunoașteți
LEGATE Cum să gestionați procesele de la terminalul Linux: 10 comenzi pe care trebuie să le cunoașteți

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 

Setarea permisiunii de execuție pentru script, astfel încât numai utilizatorul Mary să îl poată rula

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 

Ieșirea când Mary rulează scriptul

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 

Utilizatorul Dave nu poate rula scriptul, permisiunea este refuzată

Dacă Dave are privilegii de utilizator root, el poate încerca să ruleze scriptul ca root, folosind sudo .

 sudo /home/maryq/other-user.sh 

Ieșirea când scriptul este rulat de root

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

Folosind opțiunea de utilizator -u cu root pentru a rula scriptul ca utilizator Mary

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 

Rularea scriptului încă o dată, astfel încât să creeze un fișier text

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 

Verificarea dreptului de proprietate asupra fișierului creat de script

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 

Utilizatorul Dave nu poate citi fișierul lui Mary, permisiunea este refuzată

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' 

Citirea fișierului lui Mary folosind comanda runuser

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 

Efectuarea scriptului executabil cu chmod

Să vedem ce se întâmplă când încercăm să-l rulăm.

 ./run-maryq.sh 

Rularea scriptului cu runuser înăuntru, ca utilizator obișnuit

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 

Rularea scriptului cu runuser înăuntru, ca root

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