Vad gör kommandot sudo? Linux: Vilket är korrekt att använda: su eller sudo? Tillåt en användare att utföra ett kommando utan att ange ett lösenord

Ibland, för att lösa ett problem, måste du öppna en terminal och utföra kommandon som en superanvändare (sudo eller su), även kallad ROOT. Även om vissa av dem kan göras med ett GUI.

Du kan ta reda på varför Root behövs och används i Unix-system från, och vi kommer vidare att diskutera hur sudo eller su används i Linux-system.

Låt oss anta att vi behöver utföra en icke-standarduppgift där grafiska verktyg inte hjälper oss. Dessutom är kommandoraden ett mycket flexibelt verktyg; här kan du se resultatet av kommandon och förstå vad som går fel. Och viktigast av allt, kommandona i terminalen är standard för alla Linux-distributioner.

Så det finns två huvudsakliga sätt att få superanvändarrättigheter (Root) - sudo eller su

Kommandot sudo används på Debianliknande system eller den mer populära Ubuntu, "su" används på nästan alla andra Linux-distributioner.

Går in i sudo operativ system Ubuntu kräver att du anger root-lösenordet och ger dig sedan, efter lyckad inmatning, superanvändarrättigheter under körningen av bara ett kommando. Innan alla efterföljande kommandon som kräver roträttigheter på Debianliknande system måste du ange "sudo" igen. Och i andra Linux-distributioner, där kommandot "su" används, ger det full root-åtkomst, efter att ha angett lösenordet, tills du anger "logga ut" eller stänger terminalen.

På Debian-liknande (Ubuntu) system finns det ett knep som kan ge full root-åtkomst tills du stänger terminalen. Detta är nödvändigt om du kommer att köra många kommandon som Root, och du behöver inte ange "sudo" före varje kommando. För att göra detta, kommando:

Till exempel måste vi hitta alla befintliga användare i systemet, se deras kataloger och tilldela rättigheterna för den önskade katalogen från en användare till en annan. För att göra detta, om jag använde Ubuntu, skulle kommandot i terminalen vara:

Sudo du -sch /home/*

Detta skulle följas av root-lösenordet:

16K /home/lost+found 27G /home/pavel 34G /home/pavelubuntu 50G /home/pavelzen 110G totalt

Jag vet att jag är användare av katalogen /home/pavelzen, men jag måste också bli ägare till katalogen /home/pavelubuntu. För att göra detta måste jag återigen ange "sudo" före kommandot.

Och för andra system: först skulle jag befalla

lösenord och sedan

Du-sch /home/*

Chown -R pavelzen: /home/pavelubuntu

Så här in Linux-system terminaler och superanvändare visas.

Sudoär ett program som tillåter administratörer att ge begränsad roträttigheter användare och föra en logg över rotaktivitet. Grundfilosofin är att ge så få rättigheter som möjligt samtidigt som människor kan utföra sina uppgifter normalt. Skillnaden mot su-kommandot är att användaren anger lösenordet för sitt konto, inte root-användarlösenordet.

Sudo på Debian har en femton minuters (kanske) timeout efter att ha angett lösenordet. Det betyder att när du först anger root-lösenordet har du 15 minuter på dig under vilka du kan utföra nästa kommando utan att ange lösenordet. Timeouten kan återställas omedelbart med kommandot sudo -k.

Installerar sudo på Debian 7

aptitude installera sudo

En konfigurationsfil skapas under installationen /etc/sudoers och katalog /etc/sudoers.d, som vi kommer att prata om lite senare.

sudo kommandoalternativ

-k- låter dig återställa timeout tills du behöver ange lösenordet igen. Om du anger ett kommando som kan kräva ett lösenord, kommer timeouten att återställas specifikt för det kommandot.
-h- ett litet tips kommer att visas på standardutgången.
-V- versionen av sudo och plugins kommer att visas. Om du kör som root kommer alla inställningar att visas.
-g grupp - låter dig ange vilken grupp kommandot ska startas från.
-H- anger katalogen som kommer att specificeras i miljövariabeln HOME.
-jag- simulerar första inträde. Om kommandot inte är specificerat kommer det att logga in dig, så att du kan bli root istället för att använda sudo su.
-l[l]- om kommandot inte är specificerat, kommer en lista över tillgängliga kommandon för den anropande användaren (eller användaren som anges med parametern -U) att visas. Om ett kommando specificeras och det är tillgängligt, kommer den fullständiga sökvägen till kommandot och tillgängliga parametrar att visas. Om kommandot inte är tillgängligt kommer sudo att avslutas med status 1. Om du använder alternativet -ll eller anger -l två gånger, kommer ett mer utförligt utdataformat att användas.
-s- skalet som anges i miljövariabeln SHELL kommer att startas. Om ett kommando anges kommer det att skickas till det körande skalet för exekvering.
-U användare- tillsammans med parametern -l, låter dig visa privilegierna för en specifik användare. Som standard har root och användare med alla privilegier (ALLA) tillgång till privilegielistor.
-u användare- det angivna kommandot kommer att köras som den angivna användaren, inte som root.
-v- låter dig förlänga timeouten med 15 minuter eller vad som än är specificerat i sudoers), men inte köra några kommandon.

De flesta av de tillgängliga alternativen listas här, men inte alla. För att se hela listan använd kommandot man sudo.

Konfigurera sudo på Debian 7

Det rekommenderas att ställa in alla användarinställningar i filer i katalogen /etc/sudoers.d, inte i huvudfilen /etc/sudoers. Det vill säga, du kan skapa en fil med vilket namn som helst i katalogen /etc/sudoers.d och listar redan de nödvändiga inställningarna i den.

Fil /etc/sudoers det rekommenderas att redigera med hjälp av verktyget visudo, eftersom den låser filen och kontrollerar att direktiven är korrekta vid stängning. visudo använder en standardtextredigerare, som kan åsidosättas i sudoers direktiv som:

Hur paradoxalt det än kan tyckas, kommandot sudo utesluter inte att en administratörssession körs i en vanlig användarsession. För med dess hjälp kan du köra samma su-kommando:

$sudo su

Och detta är även i Ubuntu, där det inte finns något root-konto; mer exakt, det finns inget standardlösenord. Men att använda sudo gör det onödigt även för su-kommandot. Men det är inte förbjudet att ställa in ett superanvändarlösenord - trots allt, för att göra detta räcker det med att ge kommandot

$sudo passwd

för att använda su på vanligt sätt i framtiden. Och även, om så önskas, logga in som root när du registrerar dig i systemet.

Men även här ger kommandot sudo en "ideologiskt korrekt" metod, och inte ens bara en. Dessa är alternativen -s och -i, som förlänger, om än på något olika sätt, åtgärden av sudo-kommandot under en obestämd period, tills den "sekundära sessionen" avslutas med exit-kommandot.

Alternativet -s, när du öppnar en sekundär rotsession, bevarar alla miljövariabler för den ursprungliga användaren. Men om du lägger till alternativet -H till det, kommer dessa variabler att läsas igen från profilfilerna i administratörens hemkatalog, det vill säga /root, som när du startar en interaktiv skalinstans. Katalogen som var aktuell när kommandot angavs kommer dock inte att ändras, inte heller kommer typen av prompt att ändras. kommandorad.

Alternativet -i reproducerar rotmiljön fullständigt och startar dess kommandoskal som ett inloggningsskal. Naturligtvis, i det här fallet ändras den aktuella katalogen till /root, och kommandoradsprompten antar den form som beskrivs i motsvarande variabel i profilfilen för administratörsskalet (i bash - PS1).

I praktiken är skillnaden mellan båda formerna för att få permanenta administratörsrättigheter inte stor, särskilt i bash. Men i zsh, med lämpliga inställningar för profilfilerna, om så önskas, kan du uppnå en betydligt annorlunda miljö i vart och ett av dessa fall. Det är sant, hur mycket användaren behöver detta är en stor fråga. Men det faktum att när du använder -H-alternativen, att vara i permanent administrativt läge inte visas utåt på något sätt är fyllt med fel. Och gör att använda -i-alternativet att föredra i de flesta fall.

Förresten, funktionerna hos sudo är inte begränsade till att köra kommandon som administratör: genom att ange alternativet -u användarnamn kan de köras på uppdrag av användaren vars inloggning anges som dess värde. Detta kan vara användbart när du visar eller kopierar en annan användares punktfiler och punktkataloger, som ofta endast är läsbara och redigerbara av ägaren.

Förresten, kommandot sudo kan köras så att det frågar efter lösenordet för användaren under vars namn kommandot kommer att utföras (till exempel en administratör), och inte den som kräver hans auktoritet. Det finns ett alternativ -targetpw för detta. Och för att göra root-lösenordskravet permanent räcker det att definiera till exempel ett alias som

Alias ​​​​sudo -targetpw

Att kräva att root-lösenordet anges när du kör sudo är standardbeteendet i vissa distributioner, till exempel, som de säger, i Suse.

Kommandot sudo har många fler alternativ - jag listade ovan bara de som jag var tvungen att använda. Resten är lätta att slå upp i man sudo. Av de som inte är listade kommer jag också att nämna alternativet -b, som instruerar att köra kommandot "övervakande" i bakgrunden. Det kan vara användbart när du utför långsiktiga åtgärder, till exempel när du kopierar USB-bilder till en flashenhet med kommandot dd.

Som vi just såg ger sudo-kommandot användaren nästan obegränsade befogenheter för alla systemomfattande åtgärder, såväl som för att manipulera andras användardata. Låt oss i detta avseende ställa följande frågor:

  • om någon användare kan få administratörsrättigheter genom kommandot sudo, och
  • kan han utföra alla administrativa åtgärder med den?

Om vi ​​pratar om Ubuntu-familjen, där denna mekanism först användes "out of the box", då "out of the box" kommer svaret på den första frågan att vara negativt, till den andra - positivt. I allmänhet beror detta på inställningarna för sudo-programmet, som beskrivs i filen /etc/sudoers. Och i den kan du ställa in regler som tillåter endast vissa användare att utföra vissa kommandon. Sammanfattningsvis ser det ut så här:

Användarnamn host = kommando

Här, som du kanske gissar, är användarnamn namnet på användaren för vilken denna regel är inställd, värd är namnet på maskinen från vilken han kan tillgripa denna regel, kommando är ett specifikt kommando, vars användning denna användare är tillåts från denna maskin. Kommandot måste ges med en fullständig absolut sökväg (det vill säga /sbin/fdisk, inte fdisk). Kommandobeskrivningsfältet kan innehålla flera värden separerade med kommatecken, till exempel:

Användarnamn ALL = /sbin/fdisk,/bin/mount

I Ubuntu beskrivs standardreglerna för användaråtkomst till administrativa privilegier enligt följande:

# Användarbehörighetsspecifikation root ALLA=(ALLA) ALLA # Medlemmar i administratörsgruppen kan få root-rättigheter %admin ALLA=(ALLA) ALLA

Det vill säga att rotanvändaren, som förväntat, kan utföra alla kommandon från alla värdar. Men endast användare som är medlemmar i administratörsgruppen (analogt med hjulgruppen, som diskuterades i) kan få sina rättigheter. En användare som skapas under en normal installation blir automatiskt medlem i denna grupp - och har därför fullständiga administrativa rättigheter tillgängliga för honom utan några ytterligare inställningar. Andra användare vars konton kommer att skapas senare berövas dock denna behörighet. Såvida de inte specifikt ingick i administratörsgruppen.

I andra distributioner som inte använder sudo out of the box, måste du redigera dess konfigurationsfil - samma /etc/sudoers som nämns ovan.

/etc/sudoers-filen är en vanlig textfil, och följaktligen kan den redigeras i alla textredigerare(eller, säg, med ed eller sed). Det finns dock en viss risk att skruva ihop något (på grund av vanliga stavfel), till och med så att du helt blockerar din åtkomst till superanvändarprivilegier. Naturligtvis kan dessa situationer korrigeras - till exempel genom att starta om i enanvändarläge. Det är dock bättre att inte slå dem. Och därför skulle ett mer tillförlitligt sätt att modifiera /etc/sudoers vara att använda ett verktyg speciellt utformat för detta ändamål - visudo.

Visudo-verktyget gör inget övernaturligt - det öppnar helt enkelt /etc/sudoers i en textredigerare som beskrivs av variabeln superuser EDITOR (om en inte är definierad kommer den att vara klassisk igen - därav namnet) och låter dig redigera den på vanligt sätt, och avsluta sedan editorn med att spara resultaten med dess standardmetoder. Men innan detta kontrolleras redigeringsresultatet för korrekthet. Och om ett brott mot syntaxen som accepteras för /etc/sudoers upptäcks, utfärdas en motsvarande varning. Därefter kan du återgå till redigering, vägra ändringarna som gjorts eller ändå acceptera dem (naturligtvis på eget ansvar).

Visudo-verktyget garanterar inte 100 % redigeringsframgång. Eftersom det bara kontrollerar syntaxens konsekvens, men inte "riktigheten av själva reglerna." Det vill säga, om ett fel görs när du anger sökvägen till kommandot som krävs för en given regel, kommer detta kommando via sudo inte att fungera.

Men i verkligheten ser det oftast mycket enklare ut och inte alls skrämmande. Så i Fedora 11, i exempelkonfigurationen /etc/sudoers behövde jag bara avkommentera raden

%hjul ALLA=(ALLA) ALLA

att ge användaren från den angivna gruppen (och jag inkluderade mig själv där i förväg, som beskrivs i) alla rättigheter som beviljats ​​administratören. Samtidigt kan du ge dig själv möjligheten att använda sudo utan lösenord. Detta skulle kräva att raden avkommenterades

# %hjul ALLA=(ALLA) NOPASSWD: ALLA

Men jag begränsade mig till att få lösenordet att hålla längre genom att lägga till (den initialt saknade raden

Standardinställningen timestamp_timeout=10

där timeoutvärdet anges i minuter. Förresten, om du ändrar det till noll -

Standardinställningen timestamp_timeout=0

sedan kommer lösenordet att begäras varje gång du använder kommandot sudo.

Du kan tvärtom inaktivera timeout för sudo-åtgärden genom att ange ett negativt värde för den:

Standardinställningen timestamp_timeout=-1

I det här fallet kommer lösenordet att begäras endast första gången du anropar det här kommandot.

En närmare titt på filen /etc/sudoers kommer lätt att avslöja möjligheter att ge vissa användare eller grupper endast en begränsad uppsättning rättigheter. Men det är här som subtiliteterna i verklig administration börjar. Jag berövade helt enkelt min dubbelexperimentator tillgång till administrativa åtgärder för att stoppa alla hans försök på detta område. Men inte ens detta tillåter mig alltid att klara av honom - precis som Timur Shaov inte kan klara av sin lyriska hjälte.

Ibland behöver du bara köra ett kommando från en annan användare. Och det finns flera sätt hur detta kan göras. Jag kommer att prata om dem i min artikel "Kör ett kommando som en annan användare i Unix/Linux".

Kör ett kommando som en annan användare i Unix/Linux - metod 1

Och så kan du använda SUDO-verktyget. Låt oss titta på ett exempel:

$ sudo -H -u Your_another_user -c "ping site"

Förklaringar:

  • -H YOUR_HOME: Ställer in HOME (miljövariabel för en specifik användares hem) och är som standard root.
  • -u YOUR_USER: Ange användaren från vilken kommandot ska köras.
  • -c YOUR_COMMAND: Fungerar som ett alternativ för att ange ett kommando.

Något som det här.

Kör ett kommando som en annan användare i Unix/Linux - metod 2

Du kan använda SU-verktyget. Och nu ska jag ge några exempel.

Logga in som root-användare

För att få root, kör:

$su -root

Kör kommandot som root-användare

Här är ett exempel på kommando:

# su - root -c "DITT_KOMMAND_HÄR"

Su - -c "YOUR_COMMAND_HERE arg1"

Kör ett kommando från en annan användare med su

Så här är ett exempel:

# su -c "/opt/solr/bin/solr skapa -c test_solr_core -n solrconfig.xml" -s /bin/sh solr Skapat ny kärna "test_solr_core"

Låt oss titta på ett annat exempel:

$ su another_user -c "ping site"

$su -YOUR_USER -c "DIN_KOMMAND_HÄR"

  • — — Kommer att simulera inloggningen för den angivna användaren.
  • -c - Används för att specificera kommandot som ska köras (för den angivna användaren).

Något som det här.

Kör ett kommando som en annan användare i Unix/Linux - metod 3

Och så kan du använda runuser-verktyget. Kommandot runuser startar ett skal med ersättande användar- och grupp-ID:n. Detta kommando är bara användbart när du är inloggad som root. Syntaxen är som följer:

# runuser -l DIN_ANVÄNDARE -c "DITT_KOMMAND_HÄR"

Som ett exempel ska jag visa följande rad:

# runuser -l nginx -c "service nginx start"

PS: Kommandot runuser kräver inget lösenord och bör endast köras av rotanvändaren.

Huvudalternativ:

  • -l: Skapa ett inloggningsskal med PAM-filen runuser-l istället för standard.
  • -g: Pekar på huvudgruppen.
  • -G: Indikerar ytterligare en grupp.
  • -c: Det används faktiskt för att specificera ett kommando.
  • –session-command=KOMMAND: Skicka ett enda kommando till skalet med alternativet "-c" och skapar ingen ny session.
  • -m: Återställ inte miljövariabler (ENV).

Det är allt, ämnet "Kör ett kommando som en annan användare i Unix/Linux" är klart.

Om du använder sudo-kommandot med jämna mellanrum, är jag säker på att du har märkt att en egenhet i hur det fungerar är att efter att du har angett ditt lösenord, kan du använda sudo flera gånger till utan att ange ett lösenord alls. Men efter en tid börjar sudo-kommandot att be om ett lösenord igen.

Detta beteende har ingenting att göra med antalet kommandon som körs via sudo, men det har att göra med tiden. Ja, som standard kommer sudo inte att fråga dig om ett lösenord på 15 minuter efter att det har verifierats. Efter dessa 15 minuter kommer sudo att be dig ange ditt lösenord igen.

Du kan dock ändra det beskrivna beteendet om du vill. För att göra detta, öppna konfigurationsfilen /etc/sudoers med följande kommando:

Sudo visudo

Efter detta måste du gå till linjen

Defaults env_reset

och lägg till följande variabel med det nya värdet (i fet stil) i slutet av denna rad:

Defaults env_reset ,timestamp_timeout=[nytt värde]

Fältet "[nytt värde]" ska ersättas med det antal minuter din sudo-session ska existera under. Till exempel använde jag värdet 40.

Om du vill bli tillfrågad om ett lösenord varje gång du använder kommandot sudo, kan du ställa in denna variabel till 0. Och om du behöver att sudo-sessionen ska vara för evigt kan du ställa in denna variabel till -1.

Observera att det starkt avråds från att använda ett värde på -1 för variabeln i fråga.

sudo lösenord

Som du kanske har märkt visas inga symboler under processen för inmatning av lösenord, inte ens de vanliga asteriskerna. Även om detta inte är ett stort problem, vill vissa användare se åtminstone stjärnor av olika anledningar.

Lyckligtvis är motsvarande lösenordsläge ganska enkelt att aktivera. Allt du behöver göra är att ändra följande rad i din /etc/sudoers-fil:

Defaults env_reset

per rad

Defaults env_reset,pwfeedback

Nu kommer asterisker att visas när du anger ditt lösenord när du använder sudo-verktyget.

Några viktiga sudo-kommandoalternativ

Förutom alternativet -u (som vi diskuterade i början av den här artikeln) finns det flera andra viktiga parametrar sudo-kommandon som är värda att nämnas. Vi kommer att diskutera några av dem i det här avsnittet.

Alternativ -k

Låt oss säga att du bara körde ett kommando med sudo och angav ditt lösenord. Som du vet kommer sudo som standard inte att be om ett lösenord under de kommande 15 minuterna. Låt oss nu säga att du behövde ge någon åtkomst till din terminal utan möjlighet att använda sudo. Vad kan man göra i det här fallet?

Lyckligtvis finns det ett -k-alternativ för att tvångsmässigt avsluta din sudo-session. Här är vad som skrivs om denna parameter på sudo manualsidan:

-k, --återställ-tidsstämpel

När den används utan ett kommando kan du återställa cachade användarinställningar. Med andra ord, nästa gång du ringer sudo kommer du att bli tillfrågad om ett lösenord. Det här alternativet kräver inget lösenord och lades till specifikt för att tillåta användare att ta bort sudo-behörighetsinformation från .logout-filen.

När det används tillsammans med ett kommando eller ett lösenordskrävande alternativ kan du bli ombedd att ange ett lösenord eftersom det här alternativet gör att cachad sudo-behörighetsinformation ignoreras. Som ett resultat kommer sudo igen att fråga dig om ett lösenord (om det krävs av säkerhetspolicyn) och kommer inte att uppdatera cachad behörighetsinformation.

-s alternativ

Det kan hända att när du arbetar behöver du köra många kommandon som kräver root-privilegier, och du vill inte skriva sudo-prefixet framför var och en av dem. Du vill inte heller konfigurera sudo-sessionens varaktighet genom att redigera konfigurationsfilen /etc/sudoers.

I det här fallet kan du finna alternativet -s användbart. Detta är beskrivningen av detta alternativ från sudo man-sidan:

-s, --skal

Starta ett kommandoskal vars binära sökväg specificeras av miljövariabeln SHELL, om en sådan finns, eller ett kommandoskal vars binära sökväg anges i den anropande användarens kontoparametrar. Om ett kommando används kommer det att skickas till detta skal för efterföljande exekvering med hjälp av standardalternativet -c. Om inget kommando ges kommer användaren att ges tillgång till det interaktiva kommandoskalet som körs.

Så den här parametern gör följande:

  1. Startar ett nytt kommandoskal, vars sökväg till den binära filen specificeras med miljövariabeln $SHELL. Om miljövariabeln $SHELL är tom, startas kommandoskalet, vars sökväg till den binära filen anges på raden som beskriver de aktuella användarkontoparametrarna i filen /etc/passwd.
  2. Om du skickar kommandot tillsammans med alternativet -s (till exempel kör sudo -s whoami), körs följande kommando: sudo /bin/bash -c whoami .
  3. Om du inte försöker köra något av dina kommandon (det vill säga du kör bara sudo -s) har du tillgång till ett interaktivt kommandoskal med root-privilegier.

Observera att alternativet -s ger dig ett kommandoskal med root-privilegier, men utan rotmiljön - detta skal kommer att använda din .bashrc-fil. I huvudsak betyder detta att, till exempel, när den körs med detta skal whoami-kommandot visar ditt användarnamn, inte root.

Alternativ -i

Alternativet -i liknar alternativet -s som vi just diskuterade. Det finns dock vissa skillnader mellan dem. En av de viktigaste skillnaderna är att alternativet -i också ger dig rootanvändarens miljö, så din (användarens) .bashrc-fil ignoreras. Detta är jämförbart med att använda root-användarkontot utan att logga in som root. Dessutom behöver du inte ange ditt root-lösenord.

Viktig notering: Kom ihåg att det också finns ett su-kommando som låter dig köra som andra användare (som standard blir du root). Detta kommando kräver rootanvändarens lösenord. För att undvika att behöva ange användarens lösenord kan du också använda prefixet sudo (det vill säga kommandot sudo su); i detta fall måste du ange ditt lösenord. Emellertid har su- och sudo su-kommandona vissa skillnader; För att förstå dem, såväl som för att bekanta dig med jämförelsen av dessa kommandon med kommandot sudo -i, hänvisar du bara till diskussionen som finns tillgänglig på denna länk.

Slutsats

Jag hoppas att du åtminstone har en grundläggande förståelse för hur sudo-kommandot fungerar, samt hur du ändrar dess standardbeteende. Testa modifieringarna av /etc/sudoers själv, och kolla in diskussionen (länkad i föregående stycke) om du vill veta lite mer om detta kommando.


Topp