Ik moet iets als sudo uitvoeren zonder wachtwoord, dus ik gebruikte visudo
en voegde dit toe aan mijn sudoers
bestand:
MYUSERNAME ALL = NOPASSWD: /path/to/my/program
Toen probeerde ik het uit:
$ sudo /path/to/my/program [sudo] password for MYUSERNAME:
Waarom wordt er om een wachtwoord gevraagd? Hoe kan ik commandos uitvoeren / gebruiken als root met een niet-rootgebruiker, zonder om een wachtwoord te vragen?
Answer
Jij een ander item hebben in het sudoers
-bestand, meestal te vinden op /etc/sudoers
, die ook overeenkomt met uw gebruiker. De NOPASSWD
regel moet na die regel komen om voorrang te hebben.
Na dat gedaan te hebben, sudo
zal normaal om een wachtwoord vragen voor alle opdrachten behalve /path/to/my/program
, die je altijd zal laten uitvoeren zonder je wachtwoord te vragen.
Opmerkingen
Antwoord
Als er meerdere overeenkomende items zijn in /etc/sudoers
, gebruikt sudo de laatste. Daarom, als je een commando kunt uitvoeren met een wachtwoordprompt, en je wilt een bepaald commando kunnen uitvoeren zonder een wachtwoordprompt, je hebt de uitzondering als laatste nodig.
myusername ALL = (ALL) ALL myusername ALL = (root) NOPASSWD: /path/to/my/program
Let op het gebruik van (root)
, om het programma als root te laten draaien, maar niet als andere gebruikers. (Geef niet meer rechten dan het vereiste minimum, tenzij je de implicaties hebt bedacht.)
Opmerking voor re aders die Ubuntu niet gebruiken of die de standaard sudo-configuratie hebben gewijzigd (Ubuntus sudo is standaard ok) : het uitvoeren van shell-scripts met verhoogde rechten is riskant, je moet starten vanuit een schone omgeving (zodra de shell is gestart, het is te laat (zie Setuid toestaan op shell-scripts ), dus je hebt sudo nodig om daarvoor te zorgen). Zorg ervoor dat u Defaults env_reset
in /etc/sudoers
hebt of dat deze optie de standaardinstelling voor compileren is (sudo sudo -V | grep env
moet Reset the environment to a default set of variables
) bevatten.
Reacties
- ex om root te worden van jhon met sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
- @adrian Als je willekeurige commandos wilt toestaan als root, maak dat
john ALL=(ALL) NOPASSWD: all
. Het heeft ‘ geen zin om viasu
te gaan. - Vraag: moet ik de permissies van mijn shellscript wijzigen? zodat het kan worden gewijzigd en gelezen door de root-gebruiker, voor de veiligheid? Ik ‘ m denk eraan dat een aanvaller het script aanpast, waaraan alle machtigingen zijn toegekend zonder dat er een wachtwoord nodig is, zodat het doet wat hij / zij wil. Het is duidelijk dat de aanvaller ‘ zelfs het sudoers-bestand niet kan lezen om te weten welke scripts dit privilege hebben, maar kan nog steeds proberen met al mijn aangepaste scripts zodra hij / zij de map heeft gevonden waarin ze zich bevinden opgeslagen in de hoop dat sommigen zijn toegestaan, of iets dergelijks.
- @JeffreyLebowski Als je een sudo-regel hebt die het script uitvoert (direct of indirect), dan is het ‘ Het is essentieel dat alleen root (of mensen die hoe dan ook root-rechten hebben) naar het scriptbestand kunnen schrijven, en naar de directory met het scriptbestand, en naar de bovenliggende directory, enzovoort. Het maakt niet ‘ uit dat iemand het scriptbestand kan lezen (tenzij het een wachtwoord of zoiets bevat, maar dat ‘ een slecht idee is, als er een ‘ een wachtwoord is, zou het in zijn eigen bestand moeten staan, anders is er ‘ een te grote kans om het per ongeluk te lekken, bijv. door kopiëren door dat gedeelte van de code in een vraag op deze site te plakken).
- @alper Nee. Er zijn maar weinig dingen die opnieuw moeten worden opgestart. Na het wijzigen van
sudoers
, hoeft u ‘ niets speciaals te doen:sudo
controleert het elke keer.
Antwoord
WAARSCHUWING : Dit antwoord wordt als onzeker beschouwd. Zie opmerkingen hieronder
Volledige oplossing: De volgende stappen zullen u helpen de gewenste output te bereiken:
-
Maak een nieuw scriptbestand (vervang
create_dir.sh
door de gewenste scriptnaam):vim ~/create_dir.sh
Het script wordt gemaakt in de homedirectory van de gebruiker
-
Voeg enkele commandos toe die alleen een
root
ofsudo
gebruiker kan uitvoeren zoals het maken van een map op root directory-niveau:mkdir /abc
Opmerking: Voeg
sudo
niet toe aan deze commandos. Bewaar en sluit af (met:wq!
) -
Wijs uitvoerrechten toe met:
sudo chmod u+x create_dir.sh
-
Breng wijzigingen aan zodat dit script geen wachtwoord vereist.
-
Open het
sudoers
bestand:sudo visudo -f /etc/sudoers
-
Voeg de volgende regel toe aan het einde:
ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
Vervang
ahmad
door wat je gebruikersnaam ook is. Zorg er ook voor dat dit de laatste regel is. Bewaar en sluit af.
-
-
Voeg nu bij het uitvoeren van het commando
sudo
toe als:sudo ./create_dir.sh
Hierdoor worden de opdrachten in het scriptbestand uitgevoerd zonder om een wachtwoord te vragen.
Volg de eenvoudige stappen die hier worden genoemd http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/
Reacties
- Het zou beter zijn als u hier de relevante stappen opgeeft en de link gebruikt als back-up voor meer gedetailleerde informatie. Op die manier behoudt uw antwoord mogelijke waarde, zelfs als die link niet meer geldig zou zijn.
- Dit advies is onzeker. Het
sudo
deel vansudo chmod u+x create_dir.sh
is niet nodig aangezien de gebruiker (vermoedelijk) eigenaar is van zijn / haar thuismap. Aangezien de gebruiker kan schrijven naarcreate_dir.sh
, heb je die gebruiker effectief een gratis rootshell gegeven. - @Lekensteyn Wat ook betekent dat elk programma dat als gebruiker draait . Kan de gebruiker net zo goed toestaan om alles met sudo uit te voeren zonder wachtwoord.
- Mis ik iets? Ik denk dat de volledige
chmod
niet nodig is, aangezien je vertrouwt opsudo
om je privileges te verhogen.
Antwoord
Ik denk dat uw syntaxis verkeerd is. Ik gebruik tenminste het volgende dat voor mij werkt:
myusername ALL=(ALL) NOPASSWD: /path/to/executable
Reacties
- De
(ALL)
part is optioneel, het weglaten heeft precies hetzelfde effect.(root)
zou echter beter zijn, maar de afwezigheid ervan verklaart het probleem niet ‘. - +1 voor sudo voor dit bevel en niets anders! Geen reden om het hele systeem kapot te maken …
- @Johan: Dat stond al in de vraag.
Antwoord
Als u niet wilt dat u sudo moet gebruiken of het sudoers-configuratiebestand hoeft te wijzigen, kunt u gebruiken:
sudo chown root:root path/to/command/COMMAND_NAME sudo chmod 4775 path/to/command/COMMAND_NAME
Dit zal het commando als root laten draaien zonder de noodzaak van sudo.
Reacties
- Wauw, ik heb nog nooit van deze oplossing gehoord, verbijsterend
- @RyanNerd: Dit is geen veilige oplossing. Niet alleen kan het OP nu het commando als root uitvoeren zonder wachtwoord, maar iedereen kan het commando nu als root-gebruiker uitvoeren.
- ” chmod 4775 filename ” is een manier. Ten tweede, misschien is een betere manier om SETUID , zonder de machtigingen voor hele bestanden opnieuw te definiëren, ” chmod u + s bestandsnaam ”
- sudo chmod 005 is veilig. U wilt de huidige gebruiker niet ‘ schrijfrechten geven. Anders zou iemand in je sessie alles met je script kunnen doen.
Antwoord
Als je een distro zoals Manjaro hebt , je moet eerst een bestand afhandelen dat de definitie van / etc / sudoers overschrijft, je kunt het verwijderen of direct met dat bestand werken om je nieuwe configuraties toe te voegen.
Dit bestand is:
sudo cat /etc/sudoers.d/10-installer
De ENIGE manier om het te zien is onder rootprivilegies, je kunt deze directory niet weergeven zonder dit, dit bestand is Manjaro-specifiek, je vindt deze configuratie misschien met een andere naam , maar in dezelfde directory.
In uw bestand naar keuze kunt u de volgende regel (s) toevoegen om uw gewenste configuratie (s) te krijgen:
Authenticatie negeren voor een groep
%group ALL=(ALL) NOPASSWD: ALL
of Negeer authenticatie voor een gebruiker
youruser ALL=(ALL) NOPASSWD: ALL
of Negeer authenticatie een uitvoerbaar bestand voor een specifieke gebruiker
youruser ALL=(ALL) NOPASSWD: /path/to/executable
SNELLE OPMERKING: je opent een deur om SUDO te gebruiken zonder authenticatie, dat betekent dat je kunt draaien alles wijzigt alles van uw systeem, gebruik het met verantwoordelijkheid.
Antwoord
Controleer of sudo geen alias heeft. Voer zo uit
/usr/bin/sudo /path/to/my/program
Bijvoorbeeld een shell-alias zoals deze:
alias sudo="sudo env PATH=$PATH"
kan dit gedrag veroorzaken.
Opmerkingen
- Je hebt gelijk, mijn opmerking was hier defect, sorry daarvoor . Desalniettemin heb ik ‘ m geïntrigeerd – hoe verwacht je dat aliasing de verwerking van
sudoers
door sudo verandert. Of heb je het over het omleiden vansudo
naar iets dat altijd dit foutbericht afdrukt om wachtwoorden op te halen? Dat is hier onwaarschijnlijk … - Ik had hetzelfde probleem als het OP. Het bleek te zijn veroorzaakt doordat
alias sudo="sudo env PATH=$PATH"
in mijn~/.bashrc
stond. In plaats van het alleen voor mezelf op te lossen en blindelings mijn gang te gaan, heb ik mijn antwoord ingediend als een mogelijke oplossing voor iedereen die langs deze thread komt. - Dat ‘ is prima, maar als het niet duidelijk is (wat in dit geval voor sommige mensen niet ‘ t is), is het goed om een verklaring in het antwoord te plaatsen om wat context te bieden en voorkomen dat mensen blindelings magische bezweringen gebruiken. +2 (- (- 1) + +1). 🙂
Antwoord
Wanneer u uw script uitvoert, moet u het uitvoeren als sudo /path/to/my/script
.
Bewerken: Op basis van je reactie op een ander antwoord, wil je dit uitvoeren vanaf een pictogram. U moet een .desktop
-bestand maken dat uw programma met sudo uitvoert, net als op de terminal.
U kunt ook overwegen om voor een visuele wachtwoordprompt.
Je zou waarschijnlijk het idee moeten overwegen dat je de dingen niet als root zou moeten draaien en dat het systeem verder op de weg moet veranderen zodat je niet root-rechten nodig hebben, zou een betere manier zijn om te gaan.
Reacties
- Maak geen shell-scripts setuid . Zie Setuid toestaan op shell-scripts .
- Ik overwoog het niet eens te vermelden omdat het ‘ is zon slechte optie. Ik heb het net verwijderd omdat ik ‘ ben bang dat deze vragensteller het advies zou gebruiken, zelfs met de waarschuwing dat het een slecht advies was!
Antwoord
Dit loste het probleem voor mij op (probeerde ook enkele van de andere antwoorden, die misschien geholpen hebben):
Het script dat ik belde bevond zich in /usr/bin
, een map waar ik geen schrijfrechten voor heb (hoewel ik daar meestal bestanden kan lezen). Het script was chmodded + x (uitvoerbare toestemming), maar werkte nog steeds niet. Door dit bestand naar een pad in mijn homedirectory te verplaatsen, in plaats van /usr/bin
, kon ik het eindelijk aanroepen met sudo zonder een wachtwoord in te voeren.
Ook iets dat ik twijfelde over (verduidelijkend voor toekomstige lezers): u moet uw script uitvoeren als sudo. Typ sudo
wanneer aanroepen het script. Gebruik sudo
niet voor het commando in je script dat eigenlijk root nodig heeft (in mijn geval veranderende toetsenbordverlichting). Misschien werkt dat ook, maar dat is niet nodig, en het lijkt een betere oplossing om dat niet te doen.
Reacties
- De tweede alinea had het antwoord op mijn probleem
- @MuhammadAhmadZafar Blij het hielp!
- Het daadwerkelijk gebruiken van
sudo
in een script is prima, op voorwaarde dat je de juiste rechten hebt (ingesteld insudoers
) om de betreffende opdracht zonder wachtwoord uit te voeren. Het maakt de zaken een beetje veiliger. - zou dit antwoord echt kunnen gebruiken, herschreven als een stap-voor-stap ‘ dit is hoe je het doet ‘ in plaats van als een dialoog met de andere antwoorden
- @WalrustheCat Goed punt. Als ik mijn antwoord herlees, denk ik dat ik zelf misschien een beetje in de war was. Op dit moment echter, ‘ kan ik me niet herinneren wat de exacte situatie was, dus ik kan ‘ niet echt een betere beschrijving doen. Als je erachter komt, misschien een combinatie van meerdere antwoorden, dien dan in ieder geval een nieuw antwoord in!
Antwoord
Een andere mogelijkheid zou kunnen zijn om te installeren, configureren en vervolgens de super commando om je script uit te voeren als
super /path/to/your/script
Als je een binair uitvoerbaar (bijv. Dat u hebt gecompileerd in ELF binair bestand van een C-broncode) -wat is niet een script – als root, kunt u overwegen om het setuid (en eigenlijk /bin/login
, /usr/bin/sudo
en /bin/su
en super
gebruiken allemaal die techniek). Wees echter heel voorzichtig, je zou een enorm beveiligingslek kunnen openen .
Concreet zou je programma moeten paranoïde gecodeerd zijn (dus controleer alle argumenten en de omgeving en externe omstandigheden voordat ” handelt “, uitgaande van een mogelijk vijandige gebruiker), zou seteuid (2) en vrienden (zie ook setreuid (2) ) zorgvuldig kunnen gebruiken ( zie ook mogelijkheden (7) & inloggegevens (7) & execve (2) …)
U zult gebruik chmod u+s
(lees chmod (1) ) bij het installeren van zon binair bestand.
Maar wees heel voorzichtig .
Lees veel dingen over setuid , inclusief Geavanceerde Linu x Programmering , voordat zoiets wordt gecodeerd.
Merk op dat een script, of een shebang -ed ding, kan niet worden ingesteld. Maar je zou (in C) een klein setuid-binair bestand kunnen coderen.
Houd er rekening mee dat onder Linux de applicatiecode interageert met de Linux-kernel met behulp van syscalls (2) . De meeste kunnen mislukken, zie errno (3) . Veel Linux-applicaties (bijv. GNU bash , GNU make , GNU gdb , GNOME ) zijn open source: je mag hun broncode downloaden, bestuderen en eraan bijdragen.
Reacties
- Geavanceerde Linux-programmering is een dode link.
Antwoord
Idealiter als u aanpast welke opdrachten kunnen worden uitgevoerd via sudo
, zou u deze wijzigingen in een apart bestand onder /etc/sudoers.d/
in plaats van het sudoers
-bestand rechtstreeks te bewerken. U moet ook altijd visudo
gebruiken om de bestanden te bewerken. U mag NOOIT NOPASSWD
toekennen aan ALL
opdrachten.
Voorbeeld: sudo visudo -f /etc/sudoers.d/mynotriskycommand
Voeg uw regel in die toestemming verleent: myuser ALL= NOPASSWD: /path/to/your/program
Sla vervolgens op en sluit af en visudo
zal u waarschuwen als u syntaxisfouten heeft.
U kunt sudo -l
uitvoeren om de rechten te zien die uw gebruiker heeft gekregen, als een van de gebruikersspecifieke NOPASSWD
commandos verschijnen VOORDAT een %groupyouarein ALL=(ALL) ALL
commando in de uitvoer verschijnt, zal je om je wachtwoord worden gevraagd.
Als je vindt Als u zelf veel van deze sudoers.d-bestanden maakt, wilt u ze misschien met de naam per gebruiker maken, zodat ze gemakkelijker te visualiseren zijn. Houd er rekening mee dat de volgorde van de BESTANDSNAMEN en van de REGELS in het bestand erg belangrijk is, de LAATSTE geladen wint, of deze nu MEER of MINDER toelaatbaar is dan de vorige invoer.
U kunt de volgorde van de bestandsnamen bepalen door het voorvoegsel 00-99 of aa / bb / cc te gebruiken, maar houd er ook rekening mee dat als u ELKE bestanden heeft die geen numeriek voorvoegsel hebben, ze wordt geladen na de genummerde bestanden, waardoor de instellingen worden overschreven. Dit komt omdat, afhankelijk van uw taalinstellingen, de “lexicale sortering” de shell eerst nummers sorteert en dan mogelijk hoofdletters en kleine letters tussenvoegt bij het sorteren in “oplopende” volgorde.
Probeer printf "%s\n" {{0..99},{A-Z},{a-z}} | sort
en printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort
uit te voeren om te zien of uw huidige taal AaBbCc
etc of ABC
en vervolgens abc
om te bepalen wat het beste “laatste” lettervoorvoegsel is dat u kunt gebruiken be.
Antwoord
Om elke gebruiker toe te staan een programma als sudo uit te voeren zonder wachtwoord te vragen, kunt u de volgende regel toevoegen
%sudo ALL=(root) NOPASSWD: /path/to/your/program
in /etc/sudoers
Merk op dat % sudo het halen.
Opmerkingen
- Hoewel dat ‘ een manier is om een sudo-regel te volbrengen, is het niet ‘ Geef geen antwoord op de vraag waarom het instellen van de NOPASSWD-vlag op deze regel nog steeds resulteerde in een wachtwoordprompt. Bekijk het geaccepteerde antwoord voor een idee waarom het gebeurde.
Antwoord
Het volgende is voor het geval waarin u wil een commando uitvoeren zonder wachtwoord alleen als het een specifieke set opties heeft, waarbij een deel van de opties variabel is . AFAIK is het niet mogelijk om variabelen of waardebereiken te gebruiken in sudoers-declaraties, dwz je kunt expliciet toegang verlenen tot command option1
maar niet command option2
met:
user_name ALL=(root) /usr/bin/command option1
maar als de structuur command option1 value1
is, waarbij value1
kan variëren, je zou expliciete sudoers-regels nodig hebben voor elke mogelijke waarde van value1
. Shell-script biedt een manier om dit te omzeilen.
Dit antwoord is geïnspireerd door het antwoord van M. Ahmad Zafar en lost het beveiligingsprobleem daar op.
- Maak een shell-script waar je roep het commando aan zonder
sudo
. - Sla het script op in een root-geprivilegieerde map (bijv.
/usr/local/bin/
), het bestand is root-eigendom (bijv.chown root:wheel /usr/local/bin/script_name
) zonder schrijftoegang voor anderen (bijv.chmod 755 /usr/local/bin/script_name
). -
Voeg de uitzondering toe aan sudoers met visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
. -
Voer uw script uit
sudo script_name
.
Ik wil bijvoorbeeld de slaapstandtijd voor het beeldscherm wijzigen op macOS. Dit doe je met:
sudo pmset displaysleep time_in_minutes
Ik beschouw het wijzigen van de slaap-time-out als een onschuldige handeling die het gedoe van het typen van wachtwoorden niet rechtvaardigt, maar pmset
kan veel dingen en ik “zou deze andere dingen graag achter het sudo-wachtwoord willen houden.
Dus ik heb het volgende script op /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
Aan het einde van sudoers
bestand heb ik de volgende regel:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Om de time-out in te stellen op 3 minuten, voer ik mijn script uit vanaf het gewone gebruikersaccount user_name
:
sudo ds 3
PS Het grootste deel van mijn script is invoervalidatie, wat niet verplicht is, dus het volgende zou ook werken:
#!/bin/bash pmset displaysleep $1
Antwoord
Je kunt ook python gebruiken pudo -pakket.
Installatie:
user$ sudo -H pip3 install pudo # you can install using pip2 also
Hieronder staat het codefragment voor gebruik in Python-automatisering voor het uitvoeren van opdrachten onder root-privilege:
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"
Hieronder ziet u het cmd-voorbeeld voor het uitvoeren van opdrachten onder root-privilege:
user$ pudo ls /root Desktop Downloads Pictures Music
Antwoord
In het script sudoers
dat in / etc / uncomment staat, wordt de onderstaande regel verwijderd:
#includedir /etc/sudoers.d
Maak een bestand met een willekeurige naam in de /etc/sudoers.d/ directory en voeg de inhoud toe zoals aangegeven in de maximale antwoorden. Zoals voor alle gebruikers als root
#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root
Dit is de veiligste manier om het script uit te voeren met rootrechten.
/path/to/my/program
een Python-script was?.bashrc
)? Of zelfs een shell-script in/usr/local/sbin
? Om uit te proberen./etc
, maar sommige systemen plaatsen het elders. Als je het ‘ niet kunt vinden, probeer danman sudoers
. De lokale locatie voor dat bestand moet worden vervangen door deman
pagina in die tijdsudo
werd gebouwd voor dat systeem.