Hvordan kjøre et bestemt program som root uten passordmelding?

Jeg må kjøre noe som sudo uten passord, så jeg brukte visudo og la dette til sudoers fil:

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

Så prøvde jeg det:

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

Hvorfor ber den om passord? Hvordan kan jeg kjøre / bruke kommandoer som root med en ikke-root-bruker, uten å be om passord?

Svar

Du ha en annen oppføring i sudoers filen, vanligvis plassert på /etc/sudoers , som også samsvarer med brukeren din. NOPASSWD -regelen må være etter den ene for at den skal ha forrang.

Når du har gjort det, sudo vil be om et passord normalt for alle kommandoer unntatt /path/to/my/program, som det alltid vil la deg kjøre uten å be om passordet.

Kommentarer

  • vil dette fortsatt fungere hvis /path/to/my/program var et python-skript?
  • Kan programmet i stedet være et alias, angitt for bash (dvs. i .bashrc)? Eller til og med et skallskript inne i /usr/local/sbin? Å prøve.
  • Nikos – nei det kan ikke være et alias. Det må peke på en reell vei.
  • sudoers? hvor er? tung å bruke svaret ditt (
  • @VasiliiSuricov: Det ‘ er vanligvis i /etc, men noen systemer uttrykker det andre steder. Hvis du ikke kan ‘ ikke finne den, kan du prøve man sudoers. Den lokale plasseringen for den filen skal erstattes med man siden på det tidspunktet sudo ble bygget for det systemet.

Svar

Hvis det er flere samsvarende oppføringer i /etc/sudoers, bruker sudo den siste. Derfor, hvis du kan utføre en hvilken som helst kommando med en passordmelding, og du vil være i stand til å utføre en bestemt kommando uten passordmelding, du trenger unntaket sist.

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

Legg merke til bruken av (root), for å la programmet kjøres som root, men ikke som andre brukere. (Ikke gi flere tillatelser enn minimumskravet med mindre du har tenkt på implikasjonene.)

Merknad for re aders som ikke kjører Ubuntu eller som har endret standard sudo-konfigurasjon (Ubuntu s sudo er ok som standard) : Å kjøre skallskript med forhøyede privilegier er risikabelt, må du starte fra et rent miljø (når skallet har startet, det er for sent (se Tillat setuid på skallskript ), så du trenger sudo for å ta vare på det). Forsikre deg om at du har Defaults env_reset i /etc/sudoers eller at dette alternativet er kompileringstidens standard (sudo sudo -V | grep env skal inneholde Reset the environment to a default set of variables).

Kommentarer

  • ex for å gå rot fra jhon med sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Hvis du vil tillate vilkårlige kommandoer som root, gjør at john ALL=(ALL) NOPASSWD: all. Det ‘ har ingen vits i å gå via su.
  • Spørsmål: skal jeg endre tillatelsene til skallskriptet mitt slik at den bare kan modifiseres og leses av rotbrukeren, for sikkerhets skyld? Jeg ‘ tenker på en angriper som endrer skriptet, som har alle tillatelser gitt uten passord, slik at det gjør det han / hun vil. Angriperen kan selvsagt ‘ ikke engang lese sudoers-filen for å vite hvilke skript som har dette privilegiet, men kan fremdeles prøve med alle mine tilpassede skript når han / hun finner mappen der de er lagret i håp at noen har lov, eller noe sånt.
  • @JeffreyLebowski Hvis du har en sudo-regel som kjører skriptet (direkte eller indirekte), så ‘ Det er viktig at bare rot (eller personer som har rotprivilegier uansett) kan skrive til skriptfilen, og til katalogen som inneholder skriptfilen, og til den overordnede katalogen og så videre. Det ‘ t betyr noe for at alle kan lese skriptfilen (med mindre den inneholder et passord eller noe, men at ‘ er en dårlig ide, hvis det ‘ et passord, burde det være i sin egen fil, ellers er det ‘ for stor risiko for at det ved et uhell lekker ut, f.eks. ved kopiering- limer inn den delen av koden i et spørsmål på dette nettstedet).
  • @alper Nei. Svært få ting krever omstart. Når du har endret sudoers, trenger du ikke ‘ ikke å gjøre noe spesielt: sudo sjekker det hver gang.

Svar

ADVARSEL : Dette svaret har blitt ansett som usikkert. Se kommentarer nedenfor

Komplett løsning: Følgende trinn hjelper deg med å oppnå ønsket utgang:

  1. Opprett en ny skriptfil (erstatt create_dir.sh med ønsket skriptnavn):

    vim ~/create_dir.sh 

    Skriptet blir opprettet i brukerens hjemmekatalog

  2. Legg til noen kommandoer som bare root eller sudo bruker kan utføre som å lage en mappe på rotkatalognivå:

    mkdir /abc 

    Merk: Ikke legg til sudo til disse kommandoene. Lagre og avslutt (ved hjelp av :wq!)

  3. Tildel utfør tillatelser til det ved hjelp av:

    sudo chmod u+x create_dir.sh 
  4. Gjør endringer slik at dette skriptet ikke krever passord.

    1. Åpne sudoers fil:

      sudo visudo -f /etc/sudoers 
    2. Legg til følgende linje på slutten:

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

      Erstatt ahmad med hva brukernavnet ditt er. Sørg også for at dette er siste linje. Lagre og avslutt.

  5. Nå når du kjører kommandoen, legg til sudo før den som:

    sudo ./create_dir.sh 

    Dette kjører kommandoene inne i skriptfilen uten å be om passord.

Følg den enkle trinn nevnt her http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Kommentarer

  • Det ville være bedre om du ga de relevante trinnene her og brukte lenken som sikkerhetskopi for mer detaljert informasjon. På den måten beholder svaret mulig verdi selv om denne lenken ikke lenger vil være gyldig.
  • Dette rådet er usikkert. sudo -delen av sudo chmod u+x create_dir.sh er unødvendig ettersom brukeren (antagelig) har eierskap over sitt hjem dir. Siden brukeren kan skrive til create_dir.sh, har du effektivt gitt et gratis root shell til brukeren.
  • @Lekensteyn Hvilket betyr også for ethvert program som kjører som bruker . Kan like godt bare tillate brukeren å kjøre noe med sudo uten passord.
  • Mangler jeg noe? Jeg tror at hele chmod er unødvendig, siden du stoler på sudo for å heve dine rettigheter.

Svar

Jeg synes syntaksen din er feil. I det minste bruker jeg følgende som fungerer for meg:

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

Kommentarer

  • (ALL) delen er valgfri, og det er nøyaktig samme effekt å la være. Å ha (root) ville være bedre, men fraværet forklarer ikke ‘ problemet.
  • +1 for sudo for denne kommandoen og ingenting annet! Ingen grunn til å bryte hele systemet …
  • @Johan: Det var allerede i spørsmålet.

Svar

Hvis du vil unngå å måtte bruke sudo eller måtte endre sudoers-konfigurasjonsfilen, kan du bruke:

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

Dette vil få kommandoen til å kjøre som rot uten behov for sudo.

Kommentarer

  • Wow, jeg har aldri hørt om denne løsningen før, ufattelig
  • @RyanNerd: Dette er ikke en sikker løsning. Ikke bare kan OP nå kjøre kommandoen som root uten passord, men noen kan nå kjøre kommandoen som rotbruker.
  • » chmod 4775 filnavn » er en måte. For det andre, kanskje en bedre måte å SETUID , uten å omdefinere hele filtillatelser, er » chmod u + s filnavn »
  • sudo chmod 005 er trygt. Du vil ikke ‘ ikke gi skrivetillatelser til den nåværende brukeren. Ellers kan alle i økten din gjøre hva som helst med skriptet ditt.

Svar

Hvis du har en distro som Manjaro , må du først håndtere en fil som overstyrer definisjonen av / etc / sudoers, du kan slette den eller jobbe direkte med den filen for å legge til dine nye konfigurasjoner.

Denne filen er:

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

Den ENESTE måten å se den på er under root-rettigheter, du kan ikke liste denne katalogen uten den, denne filen er Manjaro-spesifikk, du kan finne denne konfigurasjonen med et annet navn , men i samme katalog.

I din valgte fil kan du legge til følgende linje (r) for å få ønsket konfigurasjon (er):

Ignorer autentisering for en gruppe

%group ALL=(ALL) NOPASSWD: ALL 

eller Ignorer godkjenning for en bruker

youruser ALL=(ALL) NOPASSWD: ALL 

eller Ignorer godkjenning en kjørbar fil for en bestemt bruker

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

RASK MERKNAD: Du åpner en dør for å bruke SUDO uten autentisering, det betyr at du kan løpe alt som endrer alt fra systemet ditt, bruk det med ansvar.

Svar

Bekreft at sudo ikke er alias. Kjør slik

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

For eksempel et skallalias som dette:

alias sudo="sudo env PATH=$PATH" 

kan forårsake denne oppførselen.

Kommentarer

  • Du har rett, kommentaren min var ute av drift her , beklager det . Likevel er jeg ‘ interessert – hvordan forventer du at aliasing vil endre behandlingen av sudoers av sudo. Eller snakker du om å omdirigere sudo til noe som alltid skriver ut denne feilmeldingen for å få passord? Det er lite sannsynlig her …
  • Jeg hadde det samme problemet som OP. Det viste seg å være forårsaket av å ha alias sudo="sudo env PATH=$PATH" i ~/.bashrc. I stedet for bare å løse det for meg selv og bare gå i gang med virksomheten min, sendte jeg svaret mitt som en mulig løsning for alle andre som følger denne tråden.
  • At ‘ er greit, men når det ikke er åpenbart (som i dette tilfellet ikke er ‘ t i det minste for noen mennesker), er det bra å gi en forklaring på svaret for å gi litt sammenheng og hindre folk i å bruke magiske besvergelser blindt. +2 (- (- 1) + +1). 🙂

Svar

Når du kjører skriptet ditt, må du kjøre det som sudo /path/to/my/script.

Rediger: Basert på din kommentar til et annet svar, vil du kjøre dette fra et ikon. Du må opprette en .desktop fil som kjører programmet ditt med sudo, akkurat som på terminalen.

Du kan også vurdere å bruke gtk-sudo for en visuell passordmelding.

Du bør nok vurdere ideen om at du ikke skal kjøre ting som root, og at du endrer systemet lenger ned på veien slik at du ikke trenger rottillatelser i det hele tatt, ville være en bedre måte å gå.

Kommentarer

  • Ikke lag skallskripter som setuid . Se Tillat setuid på skallskripter .
  • Jeg vurderte ikke engang å nevne det fordi det ‘ er et så dårlig alternativ. Jeg slettet det bare fordi jeg ‘ er bekymret for at denne spørgeren kan bruke rådene selv med advarselen om at det var dårlig råd!

Svar

Dette løste problemet for meg (prøvde også noen av de andre svarene, som kan ha hjulpet):

Skriptet jeg ringte var i /usr/bin, en katalog som jeg ikke har skrivetillatelser til (selv om jeg vanligvis kan lese noen filer der). Skriptet var chmodded + x (kjørbar tillatelse), men det virket fremdeles ikke. Ved å flytte denne filen til en bane i hjemmekatalogen min, i stedet for /usr/bin, kunne jeg endelig ringe den med sudo uten å skrive inn passord.

Også noe jeg tvilte om (avklaring for fremtidige lesere): Du må kjøre skriptet ditt som sudo. Skriv sudo når ringer skriptet. Ikke bruk sudo for kommandoen i skriptet ditt som faktisk trenger root (endre tastaturets bakgrunnsbelysning i mitt tilfelle). Kanskje det også fungerer, men du trenger ikke det, og det virker som en bedre løsning å ikke gjøre det.

Kommentarer

  • Andre ledd hadde svaret på problemet mitt
  • @MuhammadAhmadZafar Glad det hjalp!
  • Å bruke sudo i et skript er faktisk helt greit forutsatt at du har de rette rettighetene (angitt i sudoers) for å kjøre den aktuelle kommandoen uten passord. Det gjør ting litt sikrere.
  • kan virkelig bruke dette svaret omskrevet som trinnvis ‘ dette er hvordan du gjør det ‘ i stedet for som en dialog med de andre svarene
  • @WalrustheCat Bra poeng. Når jeg leser svaret mitt igjen, tror jeg at jeg kanskje hadde vært litt forvirret selv. Akkurat nå skjønner jeg ikke ‘ hva den eksakte situasjonen var, så jeg kan ‘ ikke virkelig gjøre en bedre skriving. Hvis du finner ut av det, kanskje en kombinasjon av flere svar, kan du i det hele tatt sende inn et nytt svar!

Svar

En annen mulighet kan være å installere, konfigurere og deretter bruke super -kommando for å kjøre skriptet ditt som

super /path/to/your/script 

Hvis du vil kjøre noe binært kjørbar (f.eks. Som du har samlet til ELF binær fra noen C-kildekode) -som er ikke et skript – som rot, kan du vurdere å gjøre det til setuid (og faktisk /bin/login, /usr/bin/sudo og /bin/su og super bruker alle den teknikken). Vær imidlertid veldig forsiktig, du kan åpne et stort sikkerhetshull .

Konkret bør programmet ditt være paranoisk kodet (så sjekk alle argumenter og miljøet og forholdene utenfor » handler «, forutsatt en potensielt fiendtlig bruker), så du kunne bruke seteuid (2) og venner (se også setreuid (2) ) nøye ( se også evner (7) & legitimasjon (7) & execve (2) …)

You «ll bruk chmod u+s (les chmod (1) ) når du installerer en slik binær.

Men vær veldig forsiktig .

Les mange ting om setuid , inkludert Advanced Linu x Programmering , før du koder noe slikt.

Legg merke til at et skript, eller en hvilken som helst shebang -ed ting, kan ikke stilles. Men du kan kode (i C) en liten setuid-binær innpakning.

Vær oppmerksom på at applikasjonskode på Linux samhandler med Linux-kjernen ved hjelp av syscalls (2) . De fleste av dem kan mislykkes, se errno (3) . Mange Linux-applikasjoner (f.eks. GNU bash , GNU make , GNU gdb , GNOME ) er åpen kildekode: du har lov til å laste ned og deretter studere og bidra til kildekoden.

Kommentarer

  • Avansert Linux-programmering er en død lenke.

Svar

Ideelt sett hvis du tilpasser hvilke kommandoer som kan kjøres via sudo, bør du gjøre disse endringene i en egen fil under /etc/sudoers.d/ i stedet for å redigere sudoers filen direkte. Du bør også alltid bruke visudo til å redigere filen (e). Du bør ALDRI gi NOPASSWDALL kommandoer.

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

Sett inn linjen din som gir tillatelse: myuser ALL= NOPASSWD: /path/to/your/program

Lagre og avslutt og visudo vil advare deg hvis du har syntaksfeil.

Du kan kjøre sudo -l for å se tillatelsene som brukeren har fått, hvis noen av de brukerspesifikke NOPASSWD kommandoer vises FØR en hvilken som helst %groupyouarein ALL=(ALL) ALL kommando i utgangen, blir du bedt om å oppgi passordet ditt.

Hvis du finner selv å lage mange av disse sudoers.d-filene, så vil du kanskje lage dem navngitt per bruker, slik at de er lettere å visualisere. Husk at bestillingen av FILENAVNENE og REGLENE i filen er veldig viktig, den SISTE som er lastet inn vinner, enten den er MER eller MINDRE tillatt enn de forrige oppføringene.

Du kan kontrollere bestillingen av filnavnet ved å bruke et prefiks på 00-99 eller aa / bb / cc, men husk også at hvis du har ALLE filer som ikke har numerisk prefiks, vil de vil lastes etter de nummererte filene, og overstyre innstillingene. Dette er fordi avhengig av språkinnstillingene dine, «leksikal sortering» bruker skallet sorteringsnumre først, og kan deretter flette store og små bokstaver når du sorterer i «stigende» rekkefølge.

Prøv å kjø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 å se om det nåværende språket ditt skriver ut AaBbCc etc eller ABCabc for å bestemme hva det beste «siste» bokstavprefikset å bruke ville være.

Svar

For å tillate enhver bruker å utføre program som sudo uten å spørre passord, kan du legge til følgende linje

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

i /etc/sudoers

Merk at % sudo gjør det.

Kommentarer

  • Selv om ‘ er en måte å oppnå en sudo-regel på, er det ikke ‘ t svar på spørsmålet om hvorfor innstilling av NOPASSWD-flagget på denne regelen fremdeles resulterte i en passordmelding. Se det aksepterte svaret for en ide om hvorfor det skjedde.

Svar

Følgende gjelder for tilfellet der du vil bare kjøre en kommando uten passord hvis den har et bestemt sett med alternativer, der en del av alternativene er variabel . AFAIK er det ikke mulig å bruke variabler eller verdiområder i sudoers-erklæringer, dvs. du kan tillate tilgang eksplisitt til command option1 men ikke command option2 ved å bruke:

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

men hvis strukturen er command option1 value1, der value1 kan variere, du må ha eksplisitte sudoers-linjer for hver mulig verdi på value1. Shell-skript gir en vei rundt det.

Dette svaret er inspirert av M. Ahmad Zafars svar og løser sikkerhetsproblemet der.

  1. Lag et skallskript der du ring kommandoen uten sudo.
  2. Lagre skriptet i en root-privilegert mappe (f.eks. /usr/local/bin/), lag filen som eies av roten (f.eks. chown root:wheel /usr/local/bin/script_name) uten skrivetilgang for andre (f.eks. chmod 755 /usr/local/bin/script_name).
  3. Legg til unntaket for sudoere ved hjelp av visudo:

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

  4. Kjør skriptet ditt sudo script_name.

For eksempel vil jeg endre skjermens tidsavbrudd på macOS. Dette gjøres ved å bruke:

sudo pmset displaysleep time_in_minutes

Jeg anser å endre hvilemodus for en uskyldig handling som ikke rettferdiggjør bryet med å skrive passord, men pmset kan gjøre mange ting, og jeg vil gjerne beholde disse andre tingene bak sudo-passordet.

Så jeg har følgende skript 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  

På slutten av sudoers -fil har jeg følgende linje:

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

For å stille tidsavbruddet til 3 minutter, kjører jeg skriptet mitt fra den vanlige brukerkontoen user_name:

sudo ds 3

PS Det meste av skriptet mitt er inndatavalidering, noe som ikke er obligatorisk, så følgende vil også fungere:

 #!/bin/bash pmset displaysleep $1  

Svar

Alternativt kan du bruke python pudo pakke.

Installasjon:

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

Nedenfor er kodebiten for bruk i python-automatisering for å kjø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 for å kjøre kommandoer under root-privilegium:

user$ pudo ls /root Desktop Downloads Pictures Music 

Svar

I skriptet sudoers som er inne i / etc / uncomment the line given below:

#includedir /etc/sudoers.d

Opprett en fil med hvilket som helst navn i katalogen /etc/sudoers.d/ og legg til innholdet som gitt i maksimale svar. Som for alle brukere som root

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

Dette er den sikreste måten å kjøre skriptet med root-tillatelse.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *