
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
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
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
Om Dave har root-användarprivilegier kan han försöka köra skriptet som root med sudo .
sudo /home/maryq/other-user.sh
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
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
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
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
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'
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
Låt oss se vad som händer när vi försöker köra det.
./run-maryq.sh
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
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