Bil

Hur man kör kommandon som en annan användare i Linux-skript

Linux-terminal på en bärbar dator över blå bakgrund.fatmawati achmad zaenuri/Shutterstock.com

Naturligt nog, när du kör ett kommando eller ett skript kör systemet det som en process som startades av dig. Men du kan köra kommandon och skript som en annan användare.

Processer har ägare

N√§r ett program eller skript k√∂rs skapar Linux en process. Den processen har en √§gare. √Ągaren √§r antingen en annan process eller namnet p√• ett anv√§ndarkonto om en person startade det.

√Ągandet av en process definierar en del av processens kapacitet och milj√∂. Beroende p√• hur processen startades, √§rver den vissa attribut fr√•n sin √∂verordnade process eller anv√§ndaren. Eller, mer strikt, den process som anv√§ndaren anv√§nde f√∂r att starta programmet som vanligtvis √§r ett skal.

Att köra ett kommando eller skript som en annan användare kan vara användbart eftersom äganderätten till alla filer som skapas av processen kommer att tillhöra lämplig användare.

Varje g√•ng vi anv√§nder sudo k√∂r vi ett kommando som en annan anv√§ndare. Standardanv√§ndarkontot som anv√§nds av sudo √§r root- eller “super”-anv√§ndaren. P√• grund av det anses sudo ofta av misstag st√• f√∂r superanv√§ndare g√∂r. Men det √§r bara slapp jargong. Det st√•r faktiskt f√∂r ers√§tta anv√§ndare g√∂r.

Med sudo kan du köra kommandon som vilken annan användare som helst, inte bara som root. Ironiskt nog behöver du root-privilegier för att göra det. Men att starta ett program eller skript som ägs av en annan användare är inte detsamma som att köra den processen som den andra användaren. Du kommer fortfarande att köra det som root.

Så här kör du faktiskt en process som en annan användare och hur du kör kommandon inifrån ett skript som om de hade körts av en annan användare.

Kör ett skript som en annan användare

Vi använder en dator som har flera användare konfigurerade. Den ena är Mary, som har användarnamnet maryq, och den andra är Dave med användarnamnet dave.

Mary har ett skript som heter “other-user.sh” i sin hemkatalog. Detta √§r texten i manuset.

#!/bin/bash

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

Den skriver ut skriptnamnet, som hålls i miljövariabeln $0. Den använder sedan pwd för att skriva ut arbetskatalogen. Slutligen använder den whoami-kommandot för att skriva ut namnet på användaren som startade skriptet. Eller vem det tänker lanserade manuset.

Kopiera texten fr√•n skriptet till en editor och spara den som “other-user.sh” i hemkatalogen f√∂r ett annat anv√§ndarkonto.

Vi måste göra skriptet körbart. Vi använder kommandot chmod och använder alternativet +x (kör) och alternativet -u (användare) för att endast ställa in exekveringsflaggan för ägaren. Det betyder att bara Mary kan köra skriptet. Vi kontrollerar filbehörigheterna med ls .

chmod u+x other-user.sh
ls

Ställer in körningsbehörigheten för skriptet så att endast användaren Mary kan köra det

Från vänster till höger lyder behörigheterna:

  • √Ągaren kan l√§sa, skriva och k√∂ra filen.
  • Gruppmedlemmar kan l√§sa och skriva filen.
  • Andra kan bara l√§sa filen.

Så de enda användare som kan köra skriptet är Mary och root. Det här är vad som händer när Mary kör skriptet:

./other-user.sh

Utdata när Mary kör skriptet

Vi får höra att den nuvarande arbetskatalogen för skriptet är Marys hemkatalog, och ägaren till skriptet är användarkontot maryq.

Som väntat kan Dave inte köra manuset.

/home/maryq/other-user.sh

Användaren Dave kan inte köra skriptet, tillstånd nekas

Om Dave har root-användarprivilegier kan han försöka köra skriptet som root med sudo .

sudo /home/maryq/other-user.sh

Utdata när skriptet körs med root

Detta är en delvis framgång. Skriptet körs, men ägaren till skriptet är root, inte maryq.

Knepet vi beh√∂ver anv√§nda √§r alternativet sudo -u (anv√§ndare). Detta l√•ter dig ange vilken anv√§ndare du vill k√∂ra kommandot som. Om du inte anv√§nder alternativet -u anv√§nder sudo som standard root. Om vi ‚Äč‚Äčvill k√∂ra kommandot som Mary m√•ste vi skicka namnet p√• deras anv√§ndarkonto till sudo-kommandot.

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

Använder användaralternativet -u med root för att köra skriptet som användare Mary

Den här gången rapporterar manuset att processägaren är maryq.

L√•t oss l√§gga till en rad i skriptet “other-user.sh”. Vi kommer att eka lite text och omdirigera utdata till en fil som heter “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

Vi skapar den nya filen i Marys hemkatalog. Det här är helt okej eftersom vi kör manuset som Mary.

./other-user.sh

Kör skriptet en gång till så att det skapar en textfil

Om vi ‚Äč‚Äčkollar i Marys hemkatalog ser vi att filen har skapats och att √§gandet av filen tillh√∂r maryqs anv√§ndarkonto.

ls -hl mary.txt

Kontrollerar äganderätten till filen som skapats av skriptet

Det här är samma beteende som vi skulle se om Mary faktiskt hade lanserat manuset själv.

RELATERAD: Hur man använder kommandot chmod på Linux

 

Kommandot runuser

Du kan använda sudo -u-kommandona som vi har använt hittills i ett skript, men det finns ett annat kommando, runuser, som är utformat för att köra processer som en annan användare än inuti skript. Den har bättre hantering av returkoden från den lanserade processen, och den har färre omkostnader än sudo.

Kommandot runuser måste köras med root, men det görs genom att köra hela skriptet som root. Du behöver inte använda sudo i skriptet. Kommandot runuser kan också användas på kommandoraden, så det är inte begränsat till skriptanvändning, även om det är den föredragna metoden för skript.

Dave kan inte lista filen “mary.txt” eftersom den finns i Marys hemkatalog och han inte har √•tkomst.

cat /home/maryq/mary.txt

Användaren Dave kan inte läsa Marys fil, tillstånd nekas

Vi kan dock kika in i filen med runuser. Alternativet Р(login) startar ett nytt skal med en miljö som ligger mycket nära skalmiljön Mary skulle ha om de faktiskt hade loggat in. Alternativet -c (kommando) följs av kommandot vi vill köra.

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

Läser Marys fil med kommandot runuser

Observera att kommandot inte behöver hela sökvägen till filen. Vi kan referera till filen på samma sätt som Mary skulle, i förhållande till sin hemkatalog.

Som anv√§ndare Dave kommer vi att skapa ett skript som heter “run-maryq.sh” med denna text i:

#!/bin/bash

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

Vi gör det körbart:

chmod +x run-maryq.sh

Gör skriptet körbart med chmod

Låt oss se vad som händer när vi försöker köra det.

./run-maryq.sh

Kör skriptet med runuser inuti, som en vanlig användare

Kommandot runuser klagar på att det körs av en vanlig användare. Låt oss köra det igen med sudo.

sudo ./run-maryq.sh

Kör skriptet med runuser inuti, som root

Det fungerar som vi vill, och precis som om Mary hade lanserat manuset själv.

Vilken ska man använda?

På kommandoraden finns det inte mycket att välja mellan. Men eftersom du ändå måste använda sudo med runuser, kan du lika gärna använda sudo på egen hand.

Men i ett skript är runuser det föredragna kommandot.

RELATERAD: 10 grundläggande Linux-kommandon för nybörjare

Botón volver arriba

Annonsblockerare upptäckt

Du måste ta bort AD BLOCKER för att fortsätta använda vår webbplats TACK