Opdrachten uitvoeren als een andere gebruiker in Linux-scripts

Opdrachten uitvoeren als een andere gebruiker in Linux-scripts
fatmawati achmad zaenuri/Shutterstock.com

Wanneer u een opdracht of script uitvoert, voert het systeem dit natuurlijk uit als een proces dat door u is gestart. Maar u kunt opdrachten en scripts uitvoeren als een andere gebruiker.

Processen hebben eigenaren

Wanneer een programma of script wordt uitgevoerd, maakt Linux een proces aan. Dat proces heeft een eigenaar. De eigenaar is een ander proces of de naam van een gebruikersaccount als een persoon het heeft gestart.

Het eigendom van een proces definieert enkele van de mogelijkheden en de omgeving van het proces. Afhankelijk van hoe het proces is gestart, erft het bepaalde kenmerken van het bovenliggende proces of de gebruiker. Of, strikter, het proces dat de gebruiker gebruikte om het programma te starten, dat meestal een shell is.

Processen beheren vanaf de Linux Terminal: 10 opdrachten die u moet kennen

VERWANTProcessen beheren vanaf de Linux Terminal: 10 opdrachten die u moet kennen

Het uitvoeren van een opdracht of script als een andere gebruiker kan handig zijn omdat het eigendom van alle bestanden die door het proces zijn gemaakt, eigendom is van de juiste gebruiker.

Elke keer dat we gebruiken sudo we voeren een opdracht uit als een andere gebruiker. Het standaard gebruikersaccount dat wordt gebruikt door sudo is de root- of ‘super’-gebruiker. Daarom, sudo wordt vaak ten onrechte gedacht te staan ​​voor super gebruiker wel. Maar dat is gewoon slap jargon. Het staat eigenlijk voor vervangende gebruiker doen.

Met sudo , kunt u opdrachten uitvoeren als elke andere gebruiker, niet alleen als root. Ironisch genoeg heb je root-rechten nodig om dit te doen. Maar het starten van een programma of script dat eigendom is van een andere gebruiker is niet hetzelfde als het uitvoeren van dat proces net zo die andere gebruiker. Je zult het nog steeds als root uitvoeren.

Hier leest u hoe u een proces daadwerkelijk uitvoert als een andere gebruiker en hoe u opdrachten uitvoert vanuit een script alsof ze door een andere gebruiker zijn uitgevoerd.

Voer een script uit als een andere gebruiker

We gebruiken een computer waarop meerdere gebruikers zijn geconfigureerd. Een daarvan is Mary, die de gebruikersnaam maryq heeft, en de andere is Dave met de gebruikersnaam dave.

Mary heeft een script genaamd “other-user.sh” in haar homedirectory. Dit is de tekst van het script.

#!/bin/bash

echo "Script name:" $0
echo "Working directory:" $(pwd)
echo "Script running as user:" $(whoami)

Het drukt de scriptnaam af, die wordt vastgehouden in de $0 omgevingsvariabele. Het gebruikt dan pwd om de werkmap af te drukken. Ten slotte gebruikt het de whoami commando om de naam af te drukken van de gebruiker die het script heeft gestart. Of wie het is? denkt na lanceerde het script.

Kopieer de tekst van het script naar een editor en sla het op als “other-user.sh” in de homedirectory van een ander gebruikersaccount.

We moeten het script uitvoerbaar maken. We gebruiken de chmod commando en gebruik de +x (uitvoeren) optie en de -u (gebruiker) optie om de uitvoeringsvlag alleen voor de eigenaar in te stellen. Dat betekent dat alleen Mary het script kan uitvoeren. We controleren de bestandsrechten met ls .

chmod u+x other-user.sh
ls

De uitvoeringsmachtiging voor het script instellen zodat alleen gebruiker Mary het kan uitvoeren

Van links naar rechts luiden de machtigingen:

  • De eigenaar kan het bestand lezen, schrijven en uitvoeren.
  • Groepsleden kunnen het bestand lezen en schrijven.
  • Anderen kunnen het bestand alleen lezen.

Dus de enige gebruikers die het script kunnen uitvoeren zijn Mary en root. Dit is wat er gebeurt als Mary het script uitvoert:

./other-user.sh

De uitvoer wanneer Mary het script uitvoert

Er is ons verteld dat de huidige werkdirectory van het script Mary’s homedirectory is en dat de eigenaar van het script het gebruikersaccount maryq is.

Zoals verwacht kan Dave het script niet uitvoeren.

/home/maryq/other-user.sh

Gebruiker Dave kan het script niet uitvoeren, toestemming is geweigerd

Als Dave root-gebruikersrechten heeft, kan hij proberen het script als root uit te voeren, met behulp van sudo .

sudo /home/maryq/other-user.sh

De uitvoer wanneer het script wordt uitgevoerd door root

Dit is een gedeeltelijk succes. Het script wordt uitgevoerd, maar de eigenaar van het script is root, niet maryq.

De truc die we moeten gebruiken is de sudo -u (gebruiker) optie. Hiermee kunt u de gebruiker specificeren als wie u de opdracht wilt uitvoeren. Als u de niet gebruikt -u keuze, sudo standaard gebruikt root. Als we de opdracht als Mary willen uitvoeren, moeten we de naam van hun gebruikersaccount doorgeven aan de sudo opdracht.

sudo -u maryq /home/maryq/other-user.sh

De gebruikersoptie -u gebruiken met root om het script uit te voeren als gebruiker Mary

Deze keer meldt het script dat de proceseigenaar maryq is.

Laten we een regel toevoegen aan het script “other-user.sh”. Goed echo wat tekst en stuur de uitvoer om naar een bestand met de naam “mary.txt”.

#!/bin/bash

echo "Script name:" $0 
echo "Working directory:" $(pwd) 
echo "Script running as user:" $(whoami)
echo "This is going into a file in /home/maryq/" > /home/maryq/mary.txt

We maken het nieuwe bestand in Mary’s homedirectory. Dit is prima, want we draaien het script als Mary.

./other-user.sh

Het script nogmaals uitvoeren zodat het een tekstbestand maakt

Als we de homedirectory van Mary controleren, zien we dat het bestand is gemaakt en dat het eigendom van het bestand toebehoort aan het maryq-gebruikersaccount.

ls -hl mary.txt

Het eigendom van het bestand dat door het script is gemaakt controleren

Dit is hetzelfde gedrag dat we zouden zien als Mary het script zelf had gelanceerd.


Het runuser-commando

Je zou de kunnen gebruiken sudo -u commando’s die we tot nu toe in een script hebben gebruikt, maar er is nog een ander commando, runuser, dat is ontworpen om processen als een andere gebruiker uit te voeren dan in scripts. Het heeft een betere verwerking van de retourcode van het gelanceerde proces en het heeft minder overheadkosten dan sudo.

De runuser commando moet worden uitgevoerd door root, maar dat wordt bereikt door het hele script als root uit te voeren. U hoeft niet te gebruiken sudo binnen het schrift. De runuser command kan ook op de opdrachtregel worden gebruikt, dus het is niet beperkt tot het gebruik van scripts, hoewel het de voorkeursmethode is voor scripts.

Dave kan het bestand “mary.txt” niet weergeven omdat het zich in de homedirectory van Mary bevindt en hij geen toegang heeft.

cat /home/maryq/mary.txt

Gebruiker Dave kan Mary's bestand niet lezen, toestemming is geweigerd

We kunnen in het bestand kijken met runuser, echter. De - (login) optie lanceert een nieuwe shell met een omgeving die heel dicht bij de shell-omgeving ligt die Mary zou hebben als ze daadwerkelijk hadden ingelogd. -c (opdracht) optie wordt gevolgd door de opdracht die we willen uitvoeren.

sudo runuser - maryq -c 'cat mary.txt'

Mary's bestand lezen met de opdracht runuser

Merk op dat de opdracht niet het volledige pad naar het bestand nodig heeft. We kunnen naar het bestand verwijzen op dezelfde manier als Mary zou doen, met betrekking tot haar homedirectory.

Als gebruiker Dave zullen we een script maken met de naam “run-maryq.sh” met deze tekst erin:

#!/bin/bash

runuser -l maryq -c 'cat mary.txt'

We maken het uitvoerbaar:

chmod +x run-maryq.sh

Het script uitvoerbaar maken met chmod

Laten we eens kijken wat er gebeurt als we het proberen uit te voeren.

./run-maryq.sh

Het script uitvoeren met runuser erin, als een gewone gebruiker

De runuser commando klaagt omdat het wordt uitgevoerd door een gewone gebruiker. Laten we het opnieuw doen met sudo.

sudo ./run-maryq.sh

Het script uitvoeren met runuser erin, als root

Dat werkt zoals we het zouden willen, en net alsof Mary het script zelf had gelanceerd.

Welke te gebruiken?

Op de opdrachtregel is er niet veel om tussen te kiezen. Maar zoals je moet gebruiken sudo met runuser hoe dan ook, je kunt net zo goed gebruiken sudo op zichzelf.

Maar in een schrift, runuser is het geprefereerde commando.

Nieuwste artikelen

Gerelateerde artikelen