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
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å viasu
. - 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:
-
Skapa en ny skriptfil (ersätt
create_dir.sh
med önskat skriptnamn):vim ~/create_dir.sh
Skriptet skapas i användarens hemkatalog
-
Lägg till några kommandon som bara
root
ellersudo
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!
) -
Tilldela exekveringsbehörigheter till det med:
sudo chmod u+x create_dir.sh
-
Gör ändringar så att detta skript inte kräver ett lösenord.
-
Öppna
sudoers
fil:sudo visudo -f /etc/sudoers
-
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.
-
-
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 avsudo chmod u+x create_dir.sh
är onödig eftersom användaren (förmodligen) äger sin hemdirektör. Eftersom användaren kan skriva tillcreate_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 omdirigerasudo
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 isudoers
) 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 NOPASSWD
på ALL
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.
- Skapa ett skalskript där du ring kommandot utan
sudo
. - 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
). -
Lägg till undantaget för sudoers med visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
. -
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.
/path/to/my/program
var ett python-skript?.bashrc
)? Eller till och med ett skalskript inuti/usr/local/sbin
? Att prova./etc
, men vissa system uttrycker det någon annanstans. Om du ’ inte hittar den, försökman sudoers
. Den lokala platsen för den filen bör ersättas medman
sida vid den tidensudo
byggdes för det systemet.