Hur kör jag ett specifikt program som root utan en lösenordsprompt?

Jag måste köra något som sudo utan lösenord, så jag använde visudo och lade till detta i min sudoers fil:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program 

Sedan testade jag det:

$ sudo /path/to/my/program [sudo] password for MYUSERNAME: 

Varför begär det ett lösenord? Hur kan jag köra / använda kommandon som root med en icke-root-användare utan att fråga om ett lösenord?

Svar

Du ha en annan post i filen sudoers , vanligtvis på /etc/sudoers , som också matchar din användare. NOPASSWD -regeln måste vara efter den för att den ska ha företräde.

Efter att ha gjort det, sudo kommer att be om ett lösenord normalt för alla kommandon utom /path/to/my/program, vilket det alltid låter dig köra utan att be om ditt lösenord.

Kommentarer

  • skulle detta fortfarande fungera om /path/to/my/program var ett python-skript?
  • Kan programmet istället vara ett alias, inställt för bash (dvs. i .bashrc)? Eller till och med ett skalskript inuti /usr/local/sbin? Att prova.
  • Nikos – nej det kan inte vara ett alias. Det måste peka på en riktig väg.
  • sudoers? var är? varmt för att använda ditt svar (
  • @VasiliiSuricov: Det ’ brukar vara i /etc, men vissa system uttrycker det någon annanstans. Om du ’ inte hittar den, försök man sudoers. Den lokala platsen för den filen bör ersättas med man sida vid den tiden sudo byggdes för det systemet.

Svar

Om det finns flera matchande poster i /etc/sudoers använder sudo den sista. Om du kan utföra något kommando med en lösenordsprompt, och du vill kunna utföra ett visst kommando utan en lösenordsprompt, du behöver undantaget senast.

myusername ALL = (ALL) ALL myusername ALL = (root) NOPASSWD: /path/to/my/program 

Observera användningen av (root), så att programmet kan köras som root men inte som andra användare. (Ge inte fler behörigheter än det minimikrav som krävs om du inte har tänkt på konsekvenserna.)

Anmärkning för re aders som inte kör Ubuntu eller som har ändrat standard sudo-konfigurationen (Ubuntu s sudo är ok som standard) : Att köra skalskript med förhöjda behörigheter är riskabelt, du måste börja från en ren miljö (när skalet har börjat, det är för sent (se Tillåt setuid i skalskript ), så du behöver sudo för att ta hand om det). Se till att du har Defaults env_reset i /etc/sudoers eller att det här alternativet är kompileringstidens standard (sudo sudo -V | grep env bör innehålla Reset the environment to a default set of variables).

Kommentarer

  • ex för att rota från jhon med sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Om du vill tillåta godtyckliga kommandon som root, gör att john ALL=(ALL) NOPASSWD: all. Det finns ’ ingen anledning att gå via su.
  • Fråga: ska jag ändra behörigheterna för mitt skalskript så att den kan modifieras och läsas av endast rotanvändare, för säkerhet? Jag ’ tänker på en angripare som ändrar skriptet, som har alla behörigheter som beviljas utan ett lösenord, så att det gör vad han / hon vill. Uppenbarligen kan angriparen ’ inte ens läsa sudoers-filen för att veta vilka skript som har detta privilegium, men kan ändå försöka med alla mina anpassade skript när han / hon hittar mappen där de är lagras i hopp om att vissa är tillåtna, eller något liknande.
  • @JeffreyLebowski Om du har en sudo-regel som kör skriptet (direkt eller indirekt) så ’ Det är viktigt att endast root (eller personer som har root-behörighet ändå) kan skriva till skriptfilen och till katalogen som innehåller skriptfilen och till dess överordnade katalog och så vidare. ’ betyder inte att vem som helst kan läsa skriptfilen (såvida den inte innehåller ett lösenord eller något, men att ’ är en dålig idé, om det finns ’ ett lösenord bör det finnas i sin egen fil, annars finns det ’ för stor risk att det oavsiktligt läcker ut det, t.ex. genom kopiering- klistra in den delen av koden i en fråga på den här webbplatsen).
  • @alper Nej. Mycket få saker kräver omstart. När du har ändrat sudoers behöver du inte ’ göra något speciellt: sudo kontrollerar det varje gång.

Svar

VARNING : Det här svaret har ansetts vara osäkert. Se kommentarer nedan

Komplett lösning: Följande steg hjälper dig att uppnå önskad effekt:

  1. Skapa en ny skriptfil (ersätt create_dir.sh med önskat skriptnamn):

    vim ~/create_dir.sh 

    Skriptet skapas i användarens hemkatalog

  2. Lägg till några kommandon som bara root eller sudo användare kan köra som att skapa en mapp på rotkatalognivån:

    mkdir /abc 

    Obs: Lägg inte till sudo till dessa kommandon. Spara och avsluta (med :wq!)

  3. Tilldela exekveringsbehörigheter till det med:

    sudo chmod u+x create_dir.sh 
  4. Gör ändringar så att detta skript inte kräver ett lösenord.

    1. Öppna sudoers fil:

      sudo visudo -f /etc/sudoers 
    2. Lägg till följande rad i slutet:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh 

      Ersätt ahmad med vad ditt användarnamn är. Se också till att det här är den sista raden. Spara och avsluta.

  5. Lägg nu till sudo före kommandot när det körs:

    sudo ./create_dir.sh 

    Detta kör kommandona inuti skriptfilen utan att be om ett lösenord.

Följ de enkla steg som nämns här http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Kommentarer

  • Det vore bättre om du angav de relevanta stegen här och använde länken som säkerhetskopia för mer detaljerad information. På så sätt behåller ditt svar ett möjligt värde även om länken inte längre är giltig.
  • Detta råd är osäkert. sudo -delen av sudo chmod u+x create_dir.sh är onödig eftersom användaren (förmodligen) äger sin hemdirektör. Eftersom användaren kan skriva till create_dir.sh har du faktiskt gett ett gratis root-skal till den användaren.
  • @Lekensteyn Vilket betyder också för alla program som körs som användare . Kan lika bra bara tillåta användaren att köra vad som helst med sudo utan lösenord.
  • Saknar jag något? Jag tror att hela chmod är onödigt eftersom du litar på sudo för att höja dina privilegier.

Svar

Jag tror att din syntax är fel. Jag använder åtminstone följande som fungerar för mig:

myusername ALL=(ALL) NOPASSWD: /path/to/executable 

Kommentarer

  • (ALL) -delen är valfri, att utelämna den har exakt samma effekt. Att ha (root) skulle dock vara bättre, men dess frånvaro förklarar inte ’ problemet.
  • +1 för sudo för detta kommando och inget annat! Ingen anledning att bryta hela systemet …
  • @Johan: Det stod redan i frågan.

Svar

Om du vill undvika att behöva använda sudo eller behöva ändra konfigurationsfilen för sudoers kan du använda:

sudo chown root:root path/to/command/COMMAND_NAME sudo chmod 4775 path/to/command/COMMAND_NAME 

Detta gör att kommandot körs som root utan behov av sudo.

Kommentarer

  • Wow, jag har aldrig hört talas om den här lösningen förut, otrevlig
  • @RyanNerd: Detta är inte en säker lösning. Inte bara kan OP nu köra kommandot som root utan lösenord, köp någon kan nu köra kommandot som rootanvändare.
  • ” chmod 4775 filnamn ” är ett sätt. För det andra, kanske ett bättre sätt att SETUID , utan att omdefiniera hela filbehörigheter är ” chmod u + s filnamn ”
  • sudo chmod 005 är säkert. Du vill inte ’ ge den aktuella användaren skrivrättigheter. Annars kan någon i din session göra vad som helst med ditt skript.

Svar

Om du har en distro som Manjaro , du måste först hantera en fil som åsidosätter definitionen av / etc / sudoers, du kan ta bort den eller arbeta direkt med den filen för att lägga till dina nya konfigurationer.

Den här filen är:

sudo cat /etc/sudoers.d/10-installer 

Det ENDA sättet att se det är under root-privilegier, du kan inte lista den här katalogen utan den, den här filen är Manjaro-specifik, du kanske hittade den här konfigurationen med ett annat namn , men i samma katalog.

I din fil kan du lägga till följande rad (er) för att få önskad konfiguration (er):

Ignorera autentisering för en grupp

%group ALL=(ALL) NOPASSWD: ALL 

eller Ignorera autentisering för en användare

youruser ALL=(ALL) NOPASSWD: ALL 

eller Ignorera autentisering en körbar för en specifik användare

youruser ALL=(ALL) NOPASSWD: /path/to/executable 

SNABB OBS: Du öppnar en dörr för att använda SUDO utan autentisering, det betyder att du kan springa allt som ändrar allt från ditt system, använd det med ansvar.

Svar

Kontrollera att sudo inte är alias. Kör så här

/usr/bin/sudo /path/to/my/program 

Till exempel ett skalalias som det här:

alias sudo="sudo env PATH=$PATH" 

kan orsaka detta beteende.

Kommentarer

  • Du har rätt, min kommentar var inte i ordning här , ledsen för det . Ändå är jag ’ intresserad – hur förväntar du dig att aliasing ska ändra bearbetningen av sudoers av sudo. Eller pratar du om att omdirigera sudo till något som alltid skriver ut detta felmeddelande till scoop-lösenord? Det är osannolikt fallet här …
  • Jag hade samma problem som OP. Det visade sig orsakas av att ha alias sudo="sudo env PATH=$PATH" i min ~/.bashrc. I stället för att bara lösa det för mig själv och blint bara gå vidare med mitt företag skickade jag in mitt svar som en möjlig lösning för alla andra som följer den här tråden.
  • Att ’ är bra, men när det inte är uppenbart (vilket i detta fall inte är ’ t åtminstone för vissa människor) är det bra att lägga en förklaring i svaret för att ge ett visst sammanhang och hindra människor från att blindt använda magiska besvärjelser. +2 (- (- 1) + +1). 🙂

Svar

När du kör ditt skript måste du köra det som sudo /path/to/my/script.

Redigera: Baserat på din kommentar till ett annat svar vill du köra detta från en ikon. Du måste skapa en .desktop -fil som kör ditt program med sudo, precis som på terminalen.

Du kan också överväga att använda gtk-sudo för en visuell lösenordsfråga.

Du bör antagligen överväga tanken att du inte ska köra saker som root och att ändra systemet längre ner på vägen så att du inte behöver rootbehörigheter alls skulle vara ett bättre sätt att gå.

Kommentarer

  • Gör inte skalskript setuid . Se Tillåt setuid i skalskript .
  • Jag tänkte inte ens nämna det eftersom det ’ är ett så dåligt alternativ. Jag raderade det bara för att jag ’ oroade mig för att denna frågare skulle kunna använda råden även med varningen att det var dåligt råd!

Svar

Detta löste problemet för mig (försökte också några av de andra svaren, som kan ha hjälpt):

Skriptet jag ringde var i /usr/bin, en katalog som jag inte har skrivbehörighet till (även om jag vanligtvis kan läsa alla filer där). Skriptet var chmodded + x (körbar tillstånd), men det fungerade fortfarande inte. När jag flyttade den här filen till en sökväg i min hemkatalog, istället för /usr/bin, kunde jag äntligen ringa den med sudo utan att ange ett lösenord.

Också något jag tvivlade på (klargörande för framtida läsare): Du måste köra ditt manus som sudo. Skriv sudo när ringer till skriptet. Använd inte sudo för kommandot i ditt skript som faktiskt behöver root (ändra tangentbordets bakgrundsbelysning i mitt fall). Kanske fungerar det också, men du behöver inte det och det verkar som en bättre lösning att inte göra det.

Kommentarer

  • Andra stycket hade svaret på mitt problem
  • @MuhammadAhmadZafar Glad det hjälpte!
  • Att faktiskt använda sudo i ett skript är helt bra förutsatt att du har rätt rättigheter (anges i sudoers) för att köra kommandot i fråga utan lösenord. Det gör saker lite säkrare.
  • kan verkligen använda det här svaret omskrivet som steg för steg ’ så gör du det ’ snarare än som en dialog med de andra svaren
  • @WalrustheCat Bra poäng. När jag läser igenom mitt svar tror jag att jag kanske själv har blivit lite förvirrad. Just nu kommer jag dock inte ’ ihåg vad den exakta situationen var så jag kan ’ inte göra en bättre skrivning. Om du räknar ut det, kanske en kombination av flera svar, skicka i alla fall ett nytt svar!

Svar

En annan möjlighet kan vara att installera, konfigurera och sedan använda super -kommando för att köra ditt skript som

super /path/to/your/script 

Om du vill köra lite binärt körbar (t.ex. att du har sammanställt till ELF binär från någon C-källkod) -som är inte ett skript – som root kan du överväga att göra det till setuid (och faktiskt /bin/login, /usr/bin/sudo och /bin/su och super använder alla den tekniken). Var dock mycket försiktig, du kan öppna ett stort säkerhetshål .

Konkret bör ditt program vara paranoiskt kodad (så kontrollera alla argument och miljön och förhållandena utanför ” agerar ”, förutsatt att en potentiellt fientlig användare), då kunde använda seteuid (2) och vänner (se även setreuid (2) ) noggrant ( se även funktioner (7) & referenser (7) & exekvera (2) …)

Du ”ll använd chmod u+s (läs chmod (1) ) när du installerar en sådan binär.

Men var mycket försiktig .

Läs många saker om setuid , inklusive Advanced Linu x Programmering innan du kodar en sådan sak.

Observera att ett skript eller något shebang -ed sak, kan inte ställas in. Men du kan koda (i C) en liten setuid-binär inslagning.

Var medveten om att applikationskod på Linux interagerar med Linux-kärnan med syscalls (2) . De flesta av dem kan misslyckas, se errno (3) . Många Linux-applikationer (t.ex. GNU bash , GNU gör , GNU gdb , GNOME ) är öppen källkod: du får ladda ner och sedan studera och bidra till deras källkod.

Kommentarer

  • Avancerad Linux-programmering är en död länk.

Svar

Helst om du anpassar vilka kommandon som kan köras via sudo bör du göra dessa ändringar i en separat fil under /etc/sudoers.d/ istället för att redigera sudoers -filen direkt. Du bör också alltid använda visudo för att redigera filerna. Du bör ALDRIG bevilja NOPASSWDALL kommandon.

Exempel: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Infoga din rad som ger tillstånd: myuser ALL= NOPASSWD: /path/to/your/program

Spara och avsluta och visudo varnar dig om du har syntaxfel.

Du kan köra sudo -l för att se de behörigheter som din användare har beviljats, om någon av de användarspecifika NOPASSWD kommandon visas INNAN alla %groupyouarein ALL=(ALL) ALL kommandon i utgången kommer du att bli ombedd att ange ditt lösenord.

Om du hittar själv skapa massor av dessa sudoers.d-filer så kanske du vill skapa dem namngivna per användare så att de är lättare att visualisera. Tänk på att beställningen av FILNAMNEN och REGLERNA i filen är mycket viktig, den SENASTE som laddas vinner, oavsett om den är MER eller MINDRE tillåtande än de tidigare posterna.

Du kan styra beställningen av filnamnet genom att använda ett prefix på 00-99 eller aa / bb / cc, men tänk också på att om du har NÅGRA filer som inte har numeriskt prefix, kommer att laddas efter de numrerade filerna, vilket åsidosätter inställningarna. Detta beror på att ”lexikal sortering”, beroende på dina språkinställningar, använder sorteringsnumren först och sedan kan fläta in stora och små bokstäver när de sorteras i ”stigande” ordning.

Försök köra printf "%s\n" {{0..99},{A-Z},{a-z}} | sort och printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort för att se om ditt nuvarande språk skriver ut AaBbCc etc eller ABC och sedan abc för att avgöra vad det bästa ”sista” bokstavsprefixet att använda skulle vara.

Svar

För att tillåta alla användare att köra program som sudo utan att fråga lösenord kan du lägga till följande rad

%sudo ALL=(root) NOPASSWD: /path/to/your/program

i /etc/sudoers

Observera att % sudo klarar det.

Kommentarer

  • Även om att ’ är ett sätt att åstadkomma en sudo-regel, är det inte ’ t svara på frågan om varför inställning av NOPASSWD-flaggan på denna regel fortfarande resulterade i en lösenordsprompt. Se det accepterade svaret för en idé varför det hände.

Svar

Följande gäller för fallet där du vill köra ett kommando utan lösenord endast om det har en specifik uppsättning alternativ, där en del av alternativen är variabel . AFAIK är det inte möjligt att använda variabler eller värdeintervall i sudoersdeklarationer, dvs du kan tillåta åtkomst uttryckligen till command option1 men inte command option2 med:

user_name ALL=(root) /usr/bin/command option1

men om strukturen är command option1 value1, där value1 kan variera, du måste ha uttryckliga sudoers-rader för varje möjligt värde på value1. Shell-skript ger en väg runt det.

Det här svaret inspirerades av M. Ahmad Zafars svar och fixar säkerhetsproblemet där.

  1. Skapa ett skalskript där du ring kommandot utan sudo.
  2. Spara skriptet i en root-privilegierad mapp (t.ex. /usr/local/bin/), gör filen rotägd (t.ex. chown root:wheel /usr/local/bin/script_name) utan skrivåtkomst för andra (t.ex. chmod 755 /usr/local/bin/script_name).
  3. Lägg till undantaget för sudoers med visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Kör ditt skript sudo script_name.

Jag vill till exempel ändra tidsgränsen för skärmens viloläge på macOS. Detta görs med:

sudo pmset displaysleep time_in_minutes

Jag anser att tidsgränsen för sömn är en oskyldig handling som inte motiverar besväret med att skriva lösenord, men pmset kan göra många saker och jag vill behålla dessa andra saker bakom sudo-lösenordet.

Så jag har följande skript vid /usr/local/bin/ds:

 #!/bin/bash if [ $# -eq 0 ]; then echo "To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"" else if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then pmset displaysleep $1 else echo "Time must be 0..180, where 0 = never, 1..180 = number of minutes" fi fi  

I slutet av sudoers -fil har jag följande rad:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

För att ställa in timeout på 3 minuter kör jag mitt skript från det vanliga användarkontot user_name:

sudo ds 3

PS Det mesta av mitt skript är inmatningsvalidering, vilket inte är obligatoriskt, så följande skulle också fungera:

 #!/bin/bash pmset displaysleep $1  

Svar

Alternativt kan du använda python pudo paket.

Installation:

user$ sudo -H pip3 install pudo # you can install using pip2 also 

Nedan är kodavsnittet för användning i python-automatisering för att köra kommandon under root-privilegium:

user$ python3 # or python2 >>> import pudo >>> (ret, out) = pudo.run(("ls", "/root")) # or pudo.run("ls /root") >>> print(ret) >>> 0 >>> print(out) >>> b"Desktop\nDownloads\nPictures\nMusic\n" 

Nedan är cmd-exemplet för att köra kommandon under root-privilegium:

user$ pudo ls /root Desktop Downloads Pictures Music 

Svar

I skriptet sudoers som är inuti / etc / unkommentar raden nedan:

#includedir /etc/sudoers.d

Skapa en fil med vilket namn som helst i katalogen /etc/sudoers.d/ och lägg till innehållet enligt de maximala svaren. Liksom för alla användare som root

#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

Detta är det säkraste sättet att köra skriptet med rootbehörighet.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *