Hvordan køres et specifikt program som root uden en adgangskode?

Jeg skal køre noget som sudo uden adgangskode, så jeg brugte visudo og tilføjede dette til min sudoers fil:

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

Så prøvede jeg det:

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

Hvorfor beder den om en adgangskode? Hvordan kan jeg køre / bruge kommandoer som root med en ikke-root-bruger uden at bede om en adgangskode?

Svar

Dig have en anden post i sudoers filen, typisk placeret i /etc/sudoers , som også matcher din bruger. NOPASSWD -reglen skal være efter den ene for at den skal have forrang.

Efter at have gjort det, sudo beder om en adgangskode normalt til alle kommandoer undtagen /path/to/my/program, som den altid vil lade dig køre uden at bede om din adgangskode.

Kommentarer

  • ville dette stadig fungere, hvis /path/to/my/program var et python-script?
  • Kan programmet i stedet være et alias, indstillet til bash (dvs. i .bashrc)? Eller endda et shell-script inde i /usr/local/sbin? At prøve.
  • Nikos – nej det kan ikke være et alias. Det skal pege på en reel sti.
  • sudoers? hvor er? varm for at bruge dit svar (
  • @VasiliiSuricov: Det ‘ er normalt i /etc, men nogle systemer siger det andetsteds. Hvis du ikke kan ‘ ikke finde den, så prøv man sudoers. Den lokale placering for den fil skal erstattes med man side på det tidspunkt sudo blev bygget til dette system.

Svar

Hvis der er flere matchende poster i /etc/sudoers, bruger sudo den sidste. Hvis du derfor kan udføre en kommando med en adgangskodeprompt, og du vil være i stand til at udføre en bestemt kommando uden en adgangskodeprompt, skal du sidst have undtagelsen.

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

Bemærk brugen af (root), for at tillade, at programmet køres som root, men ikke som andre brugere. (Giv ikke flere tilladelser end det krævede minimum, medmindre du har tænkt på konsekvenserne.)

Bemærk til gen aders, der ikke kører Ubuntu, eller som har ændret standard sudo-konfigurationen (Ubuntus sudo er som standard ok) : At køre shell-scripts med forhøjede privilegier er risikabelt, skal du starte fra et rent miljø (når shell er startet, det er for sent (se Tillad setuid på shell-scripts ), så du har brug for sudo for at tage sig af det). Sørg for, at du har Defaults env_reset i /etc/sudoers, eller at denne indstilling er kompileringstidens standard (sudo sudo -V | grep env skal indeholde Reset the environment to a default set of variables).

Kommentarer

  • ex for at gå rod fra jhon med sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Hvis du vil tillade vilkårlige kommandoer som rod, lav den til john ALL=(ALL) NOPASSWD: all. Der ‘ har ingen mening i at gå via su.
  • Spørgsmål: skal jeg ændre tilladelserne til mit shell-script så det kun kan modificeres og læses af rodbrugeren af sikkerhedshensyn? Jeg ‘ tænker på en angriber, der ændrer scriptet, som har alle tilladelser, der er givet uden behov for en adgangskode, så det gør, hvad han / hun ønsker. Angriberen kan selvfølgelig ‘ ikke engang læse sudoers-filen for at vide, hvilke scripts der har dette privilegium, men kan stadig prøve med alle mine brugerdefinerede scripts, når han / hun finder mappen, hvor de er gemt i håb, nogle er tilladt, eller noget lignende.
  • @JeffreyLebowski Hvis du har en sudo-regel, der kører scriptet (direkte eller indirekte), så ‘ Det er vigtigt, at kun root (eller personer, der alligevel har root-rettigheder) kan skrive til scriptfilen og til den mappe, der indeholder scriptfilen, og til dens overordnede bibliotek og så videre. Det betyder ikke ‘, at nogen kan læse scriptfilen (medmindre den indeholder en adgangskode eller noget, men at ‘ er en dårlig idé, hvis der ‘ en adgangskode, skal den være i sin egen fil, ellers er der ‘ for stor risiko for utilsigtet at lække den, fx ved kopi- at indsætte det afsnit af koden i et spørgsmål på dette websted).
  • @alper Nej. Meget få ting kræver genstart. Når du har ændret sudoers, behøver du ikke ‘ behøver ikke at gøre noget særligt: sudo kontrollerer det hver gang.

Svar

ADVARSEL : Dette svar er blevet anset for usikkert. Se kommentarer nedenfor

Komplet løsning: Følgende trin hjælper dig med at opnå det ønskede output:

  1. Opret en ny scriptfil (udskift create_dir.sh med dit ønskede scriptnavn):

    vim ~/create_dir.sh 

    Scriptet oprettes i brugerens hjemmekatalog

  2. Tilføj nogle kommandoer, der kun root eller sudo bruger kan udføre som at oprette en mappe på rodmappeniveau:

    mkdir /abc 

    Bemærk: Tilføj ikke sudo til disse kommandoer. Gem og afslut (ved hjælp af :wq!)

  3. Tildel udførelsestilladelser til det ved hjælp af:

    sudo chmod u+x create_dir.sh 
  4. Foretag ændringer, så dette script ikke kræver en adgangskode.

    1. Åbn sudoers fil:

      sudo visudo -f /etc/sudoers 
    2. Tilføj følgende linje i slutningen:

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

      Erstat ahmad med hvad dit brugernavn er. Sørg også for, at dette er den sidste linje. Gem og afslut.

  5. Tilføj nu sudo før den kører kommandoen, når den kører kommandoen som:

    sudo ./create_dir.sh 

    Dette kører kommandoerne inde i scriptfilen uden at bede om en adgangskode.

Følg den nemme trin nævnt her http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Kommentarer

  • Det ville være bedre, hvis du angav de relevante trin her og brugte linket som en backup for mere detaljerede oplysninger. På den måde bevarer dit svar den mulige værdi, selvom dette link ikke længere er gyldigt.
  • Dette råd er usikkert. sudo -delen af sudo chmod u+x create_dir.sh er unødvendig, da brugeren (formodentlig) har ejerskab over sit hjem dir. Da brugeren kan skrive til create_dir.sh, har du effektivt givet en gratis root shell til den bruger.
  • @Lekensteyn Hvilket betyder også for ethvert program, der kører som bruger . Kan lige så godt lade brugeren køre noget med sudo uden adgangskode.
  • Mangler jeg noget? Jeg mener, at hele chmod er unødvendigt, da du stoler på sudo for at hæve dine privilegier.

Svar

Jeg synes, din syntaks er forkert. I det mindste bruger jeg følgende, der fungerer for mig:

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

Kommentarer

  • (ALL) del er valgfri, hvis den udelades har nøjagtig den samme effekt. At have (root) ville dog være bedre, men fraværet forklarer ikke ‘ problemet.
  • +1 for sudo til denne kommando og intet andet! Ingen grund til at bryde hele systemet …
  • @Johan: Det var allerede i spørgsmålet.

Svar

Hvis du vil undgå at skulle bruge sudo eller skulle ændre sudoers-konfigurationsfilen, kan du bruge:

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

Dette vil få kommandoen til at køre som rod uden behov for sudo.

Kommentarer

  • Wow, jeg har aldrig hørt om denne løsning før, uhyggelig
  • @RyanNerd: Dette er ikke en sikker løsning. Ikke kun kan OP nu køre kommandoen som root uden adgangskode, men nogen kan nu køre kommandoen som rootbruger.
  • ” chmod 4775 filnavn ” er en måde. For det andet, måske en bedre måde at SETUID uden at omdefinere hele filtilladelser er ” chmod u + s filnavn ”
  • sudo chmod 005 er sikkert. Du vil ikke ‘ ikke give skrivetilladelser til den aktuelle bruger. Ellers kunne alle i din session gøre noget med dit script.

Svar

Hvis du har en distro som Manjaro , skal du først behandle en fil, der tilsidesætter definitionen af / etc / sudoers, du kan slette den eller arbejde direkte med den fil for at tilføje dine nye konfigurationer.

Denne fil er:

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

Den ENESTE måde at se det på er under root-rettigheder, du kan ikke liste denne mappe uden den, denne fil er Manjaro-specifik, du kan muligvis finde denne konfiguration med et andet navn , men i samme mappe.

I din valgte fil kan du tilføje følgende linje (r) for at få de ønskede konfigurationer:

Ignorer godkendelse for en gruppe

%group ALL=(ALL) NOPASSWD: ALL 

eller Ignorer godkendelse for en bruger

youruser ALL=(ALL) NOPASSWD: ALL 

eller Ignorer godkendelse af en eksekverbar fil til en bestemt bruger

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

HURTIG BEMÆRK: Du åbner en dør til at bruge SUDO uden godkendelse, det betyder at du kan køre alt, der ændrer alt fra dit system, brug det med ansvar.

Svar

Kontroller, at sudo ikke er alias. Kør sådan

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

For eksempel et shell-alias som denne:

alias sudo="sudo env PATH=$PATH" 

kan forårsage denne adfærd.

Kommentarer

  • Du har ret, min kommentar var ude af drift her , undskyld for det . Ikke desto mindre er jeg ‘ fascineret – hvordan forventer du, at aliasing ændrer behandlingen af sudoers af sudo. Eller taler du om at omdirigere sudo til noget, der altid udskriver denne fejlmeddelelse til scoop-adgangskoder? Det er usandsynligt tilfældet her …
  • Jeg havde det samme problem som OP. Det viste sig at være forårsaget af at have alias sudo="sudo env PATH=$PATH" i min ~/.bashrc. I stedet for bare at løse det for mig selv og blindt bare gå på min forretning sendte jeg mit svar som en mulig løsning for alle andre, der følger denne tråd.
  • At ‘ er fint, men når det ikke er indlysende (som i dette tilfælde ikke er ‘ t i det mindste for nogle mennesker), er det godt at sætte en forklaring i svaret for at give en vis kontekst og forhindre folk i blindt at bruge magiske besværgelser. +2 (- (- 1) + +1). 🙂

Svar

Når du udfører dit script, skal du køre det som sudo /path/to/my/script.

Rediger: Baseret på din kommentar til et andet svar, vil du køre dette fra et ikon. Du bliver nødt til at oprette en .desktop fil, der udfører dit program med sudo, ligesom på terminalen.

Du kan også overveje at bruge gtk-sudo for en visuel adgangskodeprompt.

Du bør nok overveje ideen om, at du ikke skal køre ting som root, og at ændre systemet længere nede ad vejen, så du ikke brug for rodtilladelser overhovedet ville være en bedre måde at gå.

Kommentarer

  • Lav ikke shell-scripts setuid . Se Tillad setuid på shell-scripts .
  • Jeg overvejede ikke engang at nævne det, fordi det ‘ s sådan en dårlig mulighed. Jeg slettede det bare, fordi jeg ‘ er bekymret for, at denne spørger måske bruger rådet, selv med advarslen om, at det var dårligt råd!

Svar

Dette løste problemet for mig (prøvede også nogle af de andre svar, der måske kunne have hjulpet):

Det script, jeg ringede til var i /usr/bin, en mappe, som jeg ikke har skrivetilladelse til (selvom jeg normalt kan læse alle filer der). Scriptet var chmodded + x (eksekverbar tilladelse), men det fungerede stadig ikke. Ved at flytte denne fil til en sti i min hjemmekatalog i stedet for /usr/bin kunne jeg endelig kalde den med sudo uden at indtaste en adgangskode.

Også noget jeg tvivl om (afklaring for fremtidige læsere): Du skal køre dit script som sudo. Skriv sudo når ringer til scriptet. Brug ikke sudo til kommandoen inde i dit script, der faktisk har brug for rod (skiftende baggrundsbelysning i mit tilfælde). Måske fungerer det også, men du behøver ikke det, og det virker som en bedre løsning, der ikke skal.

Kommentarer

  • Andet afsnit havde svaret på mit problem
  • @MuhammadAhmadZafar Glad det hjalp!
  • Det er faktisk fint at bruge sudo inde i et script, forudsat at du har de rette rettigheder (angivet i sudoers) for at køre den pågældende kommando uden adgangskode. Det gør tingene lidt mere sikre.
  • kunne virkelig bruge dette svar omskrevet som et trin for trin ‘ sådan gør du det ‘ snarere end som en dialog med de andre svar
  • @WalrustheCat Godt punkt. Når jeg læser igen mit svar, tror jeg, at jeg måske selv var lidt forvirret. Lige nu kan jeg dog ikke ‘ huske, hvad den nøjagtige situation var, så jeg kan ‘ ikke virkelig gøre en bedre skrivning. Hvis du finder ud af det, måske en kombination af flere svar, skal du under alle omstændigheder indsende et nyt svar!

Svar

En anden mulighed kan være at installere, konfigurere og derefter bruge super kommando til at køre dit script som

super /path/to/your/script 

Hvis du vil køre noget binært eksekverbar (f.eks. Som du har samlet til ELF binær fra en eller anden C-kildekode) -som er ikke et script- som rod, kan du overveje at gøre det til setuid (og faktisk /bin/login, /usr/bin/sudo og /bin/su og super bruger alle denne teknik). Vær dog meget forsigtig, du kan åbne et stort sikkerhedshul .

Konkret skal dit program være paranoisk kodet (så tjek alle argumenter og miljøet og de udvendige forhold før ” handler “, forudsat en potentielt fjendtlig bruger), så skal du kunne bruge seteuid (2) og venner (se også setreuid (2) ) omhyggeligt ( se også muligheder (7) & legitimationsoplysninger (7) & udfører (2) …)

Du “ll brug chmod u+s (læs chmod (1) ), når du installerer en sådan binær.

Men vær meget forsigtig .

Læs mange ting om setuid inklusive Advanced Linu x Programmering , før kodning af en sådan ting.

Bemærk, at et script eller et hvilket som helst shebang -ed ting, kan ikke indstilles. Men du kunne kode (i C) en lille setuid-binær indpakning af den.

Vær opmærksom på, at applikationskode på Linux interagerer med Linux-kernen ved hjælp af syscalls (2) . De fleste af dem kunne mislykkes, se errno (3) . Mange Linux-applikationer (f.eks. GNU bash , GNU fremstiller , GNU gdb , GNOME ) er open source: du har tilladelse til at downloade og derefter studere og bidrage til deres kildekode.

Kommentarer

  • Avanceret Linux-programmering er et dødt link.

Svar

Ideelt set hvis du tilpasser hvilke kommandoer der kan køres via sudo skal du foretage disse ændringer i en separat fil under /etc/sudoers.d/ i stedet for at redigere sudoers filen direkte. Du skal også altid bruge visudo til at redigere filerne. Du bør ALDRIG give NOPASSWDALL kommandoer.

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

Indsæt din linje, der giver tilladelse: myuser ALL= NOPASSWD: /path/to/your/program

Gem derefter og afslut og visudo advarer dig, hvis du har syntaksfejl.

Du kan køre sudo -l for at se de tilladelser, som din bruger har fået, hvis nogen af de brugerspecifikke NOPASSWD kommandoer vises FØR enhver %groupyouarein ALL=(ALL) ALL kommando i output, bliver du bedt om din adgangskode.

Hvis du finder selv at oprette masser af disse sudoers.d-filer, så måske vil du oprette dem navngivet pr. bruger, så de er lettere at visualisere. Husk, at rækkefølgen af FILENAVNE og REGLER i filen er meget vigtig, den SIDSTE indlæst vinder, hvad enten den er MERE eller MINDRE tilladelig end de tidligere poster.

Du kan styre rækkefølgen af filnavnet ved hjælp af et præfiks på 00-99 eller aa / bb / cc, men husk også, at hvis du har ALLE filer, der ikke har et numerisk præfiks, vil blive indlæst efter de nummererede filer og tilsidesætter indstillingerne. Afhængigt af dine sprogindstillinger bruger “leksikal sortering” først skallen sorteringsnumre og kan derefter flette store og små bogstaver, når de sorteres i “stigende” rækkefølge.

Prøv at køre printf "%s\n" {{0..99},{A-Z},{a-z}} | sort og printf "%s\n" {{0..99},{A-Z},{a-z}} | LANG=C sort for at se, om dit aktuelle sprog udskriver AaBbCc etc eller ABC derefter abc for at bestemme, hvad det bedste “sidste” bogstavpræfiks, der skal bruges, ville være være.

Svar

For at tillade enhver bruger at udføre program som sudo uden at spørge adgangskode kan du tilføje følgende linje

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

i /etc/sudoers

Bemærk, at % sudo gør det.

Kommentarer

  • Selvom ‘ er en måde at udføre en sudo-regel på, er den ikke ‘ t besvare spørgsmålet om, hvorfor indstilling af NOPASSWD-flag på denne regel stadig resulterede i en adgangskode-prompt. Se det accepterede svar for en idé om, hvorfor det skete.

Svar

Det følgende gælder for det tilfælde, hvor du vil kun køre en kommando uden adgangskode, hvis den har et specifikt sæt indstillinger, hvor en del af indstillingerne er variabel . AFAIK er det ikke muligt at bruge variabler eller værdiintervaller i sudoers-erklæringer, dvs. du kan tillade eksplicit adgang til command option1 men ikke command option2 ved hjælp af:

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

men hvis strukturen er command option1 value1, hvor value1 kan variere, du skal have eksplicitte sudoers-linjer for hver mulige værdi på value1. Shell-script giver en vej rundt det.

Dette svar er inspireret af M. Ahmad Zafars svar og løser sikkerhedsproblemet der.

  1. Opret et shell-script, hvor du kalde kommandoen uden sudo.
  2. Gem scriptet i en rodprivilegeret mappe (f.eks. /usr/local/bin/), lav filen root-ejet (f.eks. chown root:wheel /usr/local/bin/script_name) uden skriveadgang for andre (f.eks. chmod 755 /usr/local/bin/script_name).
  3. Føj undtagelsen til sudoers ved hjælp af visudo:

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

  4. Kør dit script sudo script_name.

For eksempel vil jeg ændre timeout for visning af dvale på macOS. Dette gøres ved hjælp af:

sudo pmset displaysleep time_in_minutes

Jeg overvejer at ændre timeout for søvn som en uskyldig handling, der ikke retfærdiggør besværet med adgangskodetypning, men pmset kan gøre mange ting, og jeg vil gerne beholde disse andre ting bag sudo-adgangskoden.

Så jeg har følgende script ved /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 slutningen af sudoers -fil har jeg følgende linje:

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

For at indstille timeout til 3 minutter kører jeg mit script fra den almindelige brugerkonto user_name:

sudo ds 3

PS Det meste af mit script er inputvalidering, hvilket ikke er obligatorisk, så følgende vil også fungere:

 #!/bin/bash pmset displaysleep $1  

Svar

Alternativt kan du bruge python pudo pakke.

Installation:

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

Nedenfor er kodestykket til brug i python-automatisering til at køre kommandoer 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" 

Nedenfor er cmd-eksemplet til kørsel af kommandoer under root-privilegium:

user$ pudo ls /root Desktop Downloads Pictures Music 

Svar

I scriptet sudoers som er inde i / etc / unkommentarer linjen nedenfor:

#includedir /etc/sudoers.d

Opret en fil med et hvilket som helst navn inde i /etc/sudoers.d/ -mappen og tilføj indholdet som angivet i de maksimale svar. Som for alle brugere som root

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

Dette er den sikreste måde at køre scriptet med rodtilladelse.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *