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