Vraag Hoe kan een script controleren of het als root wordt uitgevoerd?


Ik schrijf een eenvoudig bash-script, maar ik heb het nodig om te controleren of het als root wordt uitgevoerd of niet. Ik weet dat er waarschijnlijk een heel eenvoudige manier is om dat te doen, maar ik heb geen idee hoe.

Gewoon om duidelijk te zijn:
Wat is een eenvoudige manier om een ​​script te schrijven foo.sh, zodat de opdracht ./foo.sh uitgangen 0en het commando sudo ./foo.sh uitgangen 1?


81
2017-12-02 11:30


oorsprong




antwoorden:


#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi

117
2017-12-02 11:44



Ik accepteer deze ene oorzaak (na wat testen) met behulp van de systeemvariabele EUID (ongeveer 100 keer) sneller dan het uitvoeren van een opdracht (id -u), maar alle antwoorden werkten goed. - Malabarba
Ook, $UID en $EUID zijn bashisms. Alleen POSIX-compatibele shells hebben die variabelen niet en je moet ze gebruiken id(1) in plaats daarvan. - David Foerster
in een bash-script, zou je kunnen gebruiken if ((EUID)); then, zien @ geirha's commentaar - jfs
@Andrew: variabelen worden vervangen voordat ze worden doorgegeven aan sudo. Als je rent sudo sh -c 'echo $EUID' u zult uw verwachte resultaten zien. - M. Dudley
@Andrew - Ik weet dat ik hier veel te laat ben, maar voor het nageslacht: $EUID is een bashisme (zoals hierboven vermeld door @DavidFoerster), en jouw /bin/sh is waarschijnlijk een link naar /bin/dash, niet /bin/bash. sudo bash -c 'echo $EUID' zal het verwachte resultaat opleveren. - Adrian Günter


Een rootgebruiker hoeft niet de naam "root" te hebben. whoami geeft de eerste gebruikersnaam met gebruikers-ID terug 0. $USER bevat de naam van de ingelogde gebruiker, die een gebruikers-ID kan hebben 0, maar hebben een andere naam.

Het enige betrouwbare programma om te controleren of het account als root is aangemeld, of niet:

id -u

ik gebruik -u voor de effectief gebruikers-ID, niet -r voor de echt gebruikersnaam. Toestemmingen zijn vastbesloten Door de effectief gebruikers-ID, niet het echt een.

Tests

/etc/passwd bevat de volgende gebruikersnamen met gebruikers-ID 0 in de gegeven volgorde:

rootx
root2

Aangemeld als root2, geeft de volgende resultaten:

  • whoami: rootx
  • echo $USER: root2 (dit retourneert een lege reeks als het programma werd gestart in een lege omgeving, bijvoorbeeld env -i sh -c 'echo $USER')
  • id -u: 0 Zoals u kunt zien, zijn de andere programma's alleen voor deze controle mislukt id -u geslaagd.

Het bijgewerkte script ziet er als volgt uit:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi

98
2018-03-13 09:19



Goede analyse. +1 voor informatieve bonus - lazyPower
Je hebt het niet nodig id -u in bash askubuntu.com/questions/30148/... - jfs
Ik probeer altijd zo POSIX compliant mogelijk te blijven, met behulp van sh (dash) als tolk in plaats van bash. Maar goed schot, redt nog een vork :) - Lekensteyn
Nadat ik een tijdje koud was geweest, kwam ik terug en nam een ​​kijkje. De methode van Lekensteyn lijkt inderdaad beter te zijn. Zijn antwoord is nu het nieuwe geaccepteerde antwoord. +1 voor jou, Lekensteyn, esp. om die moeilijk bereikbare badge van deze vraag te krijgen;) - Thomas Ward♦
Ik heb kortere versies gezien, [ -w / ]. Het idee blijft hetzelfde. Opmerking: in bepaalde chroots, [ -w /etc/shadow ] zal falen omdat /etc/shadow is non-existent, dus de aanpak met / heeft de voorkeur. Een betere manier zou zijn om de daadwerkelijke behoefte aan rootrechten te controleren. Als het script moet schrijven naar /etc/someconfig, controleer of dat bestand schrijfbaar is OF het bestand bestaat niet en /etc is beschrijfbaar. - Lekensteyn


Als @Lekensteyn zei u moet een effectieve gebruikers-ID gebruiken. U hoeft niet te bellen id -u in bash:

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
   echo "You must be root to do this." 1>&2
   exit 100
fi

@ geirha's suggestie uit de opmerkingen maakt gebruik van rekenkundige evaluatie:

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi

29
2018-03-13 10:26



Over het algemeen moet je dit gebruiken ((..)) voor het testen van nummers, en [[..]] voor het testen van strings en bestanden, dus ik zou doen if (( EUID != 0 )); then in plaats daarvan, of gewoon if ((EUID)); then - geirha
@geirha: ik heb je suggestie toegevoegd. - jfs
EUID zou moeten worden $EUID. In plaats van gebruiken (( $EUID != 0 )), gebruik [ $EUID != 0 ]. Het zal werken met dash te. - Lekensteyn
@Lekensteyn: EUID werkt prima. De vraag is getagd bash niet dash. Het bevel env -i sh -c '[ $EUID != 0 ]' mislukt, maar env -i bash -c '(( EUID != 0 ))' werken. btw, dash werkt niet voor sommige niet-ascii-personages op Ubuntu stackoverflow.com/questions/5160125/... Het is 2011 en er zijn mensen die andere talen gebruiken. - jfs
Na hier op terug te kijken terwijl ik vreselijk verveeld en getest ben, ga ik deze methode gebruiken zoals hier vermeld bij de $EUID dingen vanaf dit punt naar voren. Ik heb het geaccepteerde antwoord als resultaat gewijzigd. - Thomas Ward♦


U kunt dit bereiken met behulp van de whoami opdracht, die de huidige gebruiker retourneert:

#!/bin/bash

if [ `whoami` != 'root' ]
  then
    echo "You must be root to do this."
    exit
fi

...

Het bovenstaande uitvoeren wordt afgedrukt You must be root to do this. als de huidige gebruiker dat niet is root.


Notitie: een alternatief is in sommige gevallen om gewoon de $USER variabele:

if [ $USER != 'root' ]

18
2018-03-13 07:38



Ik zal de code bekijken, kijken of het het script niet lukt of zoiets. Als het werkt, accepteer ik je antwoord :) - Thomas Ward♦
Zet dit in mijn scripts, het werkte prachtig. Erg bedankt. :) - Thomas Ward♦
@George Edison: ik beveel het gebruik niet aan $USER, vooral op deze manier. $USER wordt ingesteld door de login-shell, hoeft dit niet te worden doorgevoerd naar het programma (env -i sh -c 'echo $USER'). Op die manier, $USER is leeg en er treedt een syntaxisfout op. - Lekensteyn
@Lekensteyn is dat niet alleen $USER ingesteld door de shell, het is ook iets dat gemakkelijk te spoofen is. Whoami zal de daadwerkelijke gebruiker retourneren. - Paul de Vrieze
@PauldeVrieze Wat heeft het voor zin om die cheque voor de gek te houden? - htorque


#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?

9
2017-12-02 11:40





Rekening houdend met de efficiëntie, kunt u eerst de EUID omgevingsvariabele en vervolgens, als deze niet bestaat, de standaard bellen id opdracht:

if ((${EUID:-0} || "$(id -u)")); then
  echo You are not root.
else
  echo Hello, root.
fi

Op deze manier, vanwege de OF snelkoppeling, vermijdt u het aanroepen van een systeemopdracht, voorafgaand aan de vraag van een in-memory variabele.

Hergebruik van code:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}

6
2017-10-12 14:14





Een eenvoudige manier om het script alleen door root te laten uitvoeren, is door het script met de regel te starten:
#!/bin/su root


3
2017-08-13 21:07





#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi

1
2017-12-02 11:35





Dit fragment zou:

  • Controleer op verschillende sessies
  • suggereren om te gebruiken sudo !!
  • en retourneer een fout
if ["$ (whoami & 2> / dev / null)"! = "root"] && ["$ (id -un & 2> / dev / null)"! = "root"]
      dan
      echo "U moet root zijn om dit script uit te voeren!"
      echo "gebruik 'sudo !!'"
      afslag 1
fi

1
2017-10-16 09:17





Dit antwoord is alleen maar om een ​​idee op te slaan dat mogelijk nuttig kan zijn voor sommigen van jullie. Als u een script nodig hebt dat wordt uitgevoerd vanuit de grafische gebruikersinterface en rootrechten vereist, probeert u het op deze manier:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 $@
   exit
fi

#here go superuser commands, e.g. (switch intel cpu into powersave mode):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
cpupower frequency-set -g powersave

Op deze manier krijgt u een mooi dialoogvenster waarin u wordt gevraagd om het root-gebruikerswachtwoord. Net zoals bij de opdrachtregel sudo.

De gksudo mogelijk niet beschikbaar in uw systeem en installeer het vervolgens met sudo apt-get install gksu.


1
2017-10-17 22:00