Hoe voer ik een specifiek programma uit als root zonder een wachtwoordprompt?

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

  • zou dit nog steeds werken als het /path/to/my/program een Python-script was?
  • Kan het programma in plaats daarvan een alias zijn, ingesteld voor bash (dwz in .bashrc)? Of zelfs een shell-script in /usr/local/sbin? Om uit te proberen.
  • Nikos – nee, het kan geen alias zijn. Het moet naar een echt pad verwijzen.
  • sudoers? waar is? graag uw antwoord gebruiken (
  • @VasiliiSuricov: het ‘ s meestal in /etc, maar sommige systemen plaatsen het elders. Als je het ‘ niet kunt vinden, probeer dan man sudoers. De lokale locatie voor dat bestand moet worden vervangen door de man pagina in die tijd sudo werd gebouwd voor dat systeem.

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 via su 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:

  1. 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

  2. Voeg enkele commandos toe die alleen een root of sudo 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!)

  3. Wijs uitvoerrechten toe met:

    sudo chmod u+x create_dir.sh 
  4. Breng wijzigingen aan zodat dit script geen wachtwoord vereist.

    1. Open het sudoers bestand:

      sudo visudo -f /etc/sudoers 
    2. 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.

  5. 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 van sudo chmod u+x create_dir.sh is niet nodig aangezien de gebruiker (vermoedelijk) eigenaar is van zijn / haar thuismap. Aangezien de gebruiker kan schrijven naar create_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 op sudo 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 van sudo 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 in sudoers) 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.

  1. Maak een shell-script waar je roep het commando aan zonder sudo.
  2. 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).
  3. Voeg de uitzondering toe aan sudoers met visudo:

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

  4. 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *