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
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å viasu
. - 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:
-
Opret en ny scriptfil (udskift
create_dir.sh
med dit ønskede scriptnavn):vim ~/create_dir.sh
Scriptet oprettes i brugerens hjemmekatalog
-
Tilføj nogle kommandoer, der kun
root
ellersudo
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!
) -
Tildel udførelsestilladelser til det ved hjælp af:
sudo chmod u+x create_dir.sh
-
Foretag ændringer, så dette script ikke kræver en adgangskode.
-
Åbn
sudoers
fil:sudo visudo -f /etc/sudoers
-
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.
-
-
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 afsudo chmod u+x create_dir.sh
er unødvendig, da brugeren (formodentlig) har ejerskab over sit hjem dir. Da brugeren kan skrive tilcreate_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 omdirigeresudo
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 isudoers
) 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 NOPASSWD
på ALL
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.
- Opret et shell-script, hvor du kalde kommandoen uden
sudo
. - 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
). -
Føj undtagelsen til sudoers ved hjælp af visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
. -
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.
/path/to/my/program
var et python-script?.bashrc
)? Eller endda et shell-script inde i/usr/local/sbin
? At prøve./etc
, men nogle systemer siger det andetsteds. Hvis du ikke kan ‘ ikke finde den, så prøvman sudoers
. Den lokale placering for den fil skal erstattes medman
side på det tidspunktsudo
blev bygget til dette system.