it-swarm.dev

Jak může skript zkontrolovat, zda je spuštěn jako root?

Píšu jednoduchý bash skript, ale potřebuji ho zkontrolovat, zda je spuštěn jako root nebo ne. Vím, že je to pravděpodobně velmi jednoduchý způsob, ale nevím jak.

Jen aby bylo jasné:
Jaký je jednoduchý způsob, jak napsat skript foo.sh, takže příkaz ./foo.sh výstupy 0 a příkaz Sudo ./foo.sh výstupy 1?

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

Kořenový uživatel nemusí být pojmenován „root“. whoami vrátí první uživatelské jméno s ID uživatele 0. $USER obsahuje jméno přihlášeného uživatele, který může mít ID uživatele 0, ale mají jiné jméno.

Jediný spolehlivý program, který zkontroluje, zda je účet přihlášen jako root, či nikoli:

id -u

Používám -u pro efektivní ID uživatele, ne -r pro uživatelské jméno skutečné. Oprávnění jsou rčena podle efektivní ID uživatele, nikoliv skutečná jedna.

Testy

/etc/passwd obsahuje následující uživatelská jména s ID uživatele 0 v daném pořadí:

rootx
root2

Přihlášen jako root2, dává další výsledky:

  • whoami: rootx
  • echo $USER: root2 (vrací prázdný řetězec, pokud byl program spuštěn v prázdném prostředí, např. env -i sh -c 'echo $USER')
  • id -u: 0 Jak vidíte, ostatní programy v této kontrole selhaly, pouze id -u prošel.

Aktualizovaný skript bude vypadat takto:

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

Jak @ Lekensteyn řekl , měli byste použít efektivní ID uživatele. Nemusíte volat 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 návrh z komentářů používá aritmetické hodnocení:

#!/bin/bash

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

Toho lze dosáhnout pomocí příkazu whoami, který vrací současného uživatele:

#!/bin/bash

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

...

Spuštění výše uvedeného vytiskne You must be root to do this. pokud aktuální uživatel není root.


Poznámka: v některých případech je alternativou jednoduše zkontrolovat $USER proměnná:

if [ $USER != 'root' ]
20
Nathan Osman

S ohledem na efektivitu můžete nejprve otestovat proměnnou prostředí EUID a poté, pokud neexistuje, zavolat standardní příkaz id:

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

Tímto způsobem se z důvodu NEBO zkratky vyhnete volání systémového příkazu, přičemž upřednostňujete dotaz proměnné v paměti.

Opětovné použití kódu:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
10
Luchostein
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
9
João Pinto

Jedním z jednoduchých způsobů, jak skript spustit pouze pro uživatele root, je spuštění skriptu s řádkem:
#!/bin/su root

2
alexandre1985

Tento úryvek by:

  • Zkontrolujte různé relace
  • navrhnout použití Sudo !!
  • a vrátit chybu
 if ["$ (whoami & 2>/dev/null)"! = "root"] && ["$ (id -un & 2>/dev/null)"! = "root"] 
 then 
 echo "Pro spuštění tohoto skriptu musíte být root!" 
 echo "použijte 'Sudo !!'" 
 exit 1 
 fi 
1
rubo77

Tato odpověď je pouze pro uložení nápadu s, může být pro některé z vás užitečná. Pokud potřebujete skript, který je spuštěn z grafického uživatelského rozhraní a vyžaduje oprávnění root, zkuste tento postup:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 [email protected]
   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

Tímto způsobem získáte Nice dialogové okno s žádostí o heslo uživatele root. Stejně jako u příkazového řádku Sudo.

gksudo nemusí být ve vašem systému k dispozici, pak jej nainstalujte pomocí Sudo apt-get install gksu.

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

Tento kód funguje pod Bash i Stock Bourne sh (testováno pod FreeBSD), které nedefinuje EUID. Pokud EUID existuje, je vrácena jeho hodnota, jinak je spuštěn příkaz 'id'. Jedná se o tad kratší než výše uvedený příklad „nebo“, protože používá vestavěný Shell „: -“.

Kořen ve sh:

# echo $EUID

# euid=${EUID:-`id -u`}
# echo $euid
0

In bash:
[[email protected] ese]$ euid=${EUID:-`id -u`}
[[email protected] ese]$ echo $euid
10260
0
Clayton Haapala