Как скрипт может проверить, запущен ли он как root?

83

Я пишу простой скрипт bash, но мне нужно его проверить, выполняется ли он как root или нет. Я знаю, что есть, вероятно, очень простой способ сделать это, но я понятия не имею, как это сделать.

Просто чтобы быть ясным:
Какой простой способ написать скрипт foo.sh , так что команда ./foo.sh выводит 0 , а команда sudo ./foo.sh выдает 1 ?

    
задан Malabarba 02.12.2010 в 12:30
источник

10 ответов

116
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
    
ответ дан aneeshep 02.12.2010 в 12:44
источник
99

Пользователь root не должен называться «root». whoami возвращает первое имя пользователя с идентификатором пользователя 0 . $USER содержит имя зарегистрированного пользователя, который может иметь идентификатор пользователя 0 , но имеет другое имя.

Единственная надежная программа для проверки, зарегистрирована ли учетная запись как root, или нет:

id -u

Я использую -u для эффективного идентификатора пользователя, а не -r для идентификатора пользователя real . Разрешения определены с помощью эффективного идентификатора пользователя, а не real .

Испытания

/etc/passwd содержит следующие имена пользователей с идентификатором пользователя 0 в указанном порядке:

rootx
root2

Записанный как root2 , дает следующие результаты:

  • whoami : rootx
  • echo $USER : root2 (это возвращает пустую строку, если программа была запущена в пустой среде, например, env -i sh -c 'echo $USER' )
  • id -u : 0 Как вы можете видеть, другие программы не прошли проверку, только id -u прошло.

Обновленный скрипт будет выглядеть так:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi
    
ответ дан Lekensteyn 13.03.2011 в 10:19
29

Как @Lekensteyn сказал , вы должны использовать эффективный идентификатор пользователя. Вам не нужно вызывать id -u в bash:

#!/bin/bash

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

@ предложение geirha из комментариев использует арифметическую оценку:

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi
    
ответ дан jfs 13.03.2011 в 11:26
19

Вы можете выполнить это, используя команду whoami , которая возвращает текущего пользователя:

#!/bin/bash

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

...

Запуск выше будет печатать You must be root to do this. , если текущий пользователь не является root .

Примечание: альтернативой в некоторых случаях является просто проверка переменной $USER :

if [ $USER != 'root' ]
    
ответ дан Nathan Osman 13.03.2011 в 08:38
9
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
    
ответ дан João Pinto 02.12.2010 в 12:40
7

Принимая во внимание эффективность, вы можете сначала проверить переменную среды EUID , а затем, если она не существует, вызовите стандартную команду id :

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

Таким образом, из-за ИЛИ ярлыка вы избегаете вызова системной команды, предварительно задавая запрос переменной в памяти.

Повторное использование кода:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
    
ответ дан Luchostein 12.10.2016 в 16:14
2

Один простой способ заставить скрипт запускать только root: запустить скрипт с помощью строки:
#!/bin/su root

    
ответ дан alexandre1985 13.08.2016 в 23:07
1
#!/bin/bash
uid='id -u'
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
    
ответ дан Delan Azabani 02.12.2010 в 12:35
1

Этот фрагмент будет:

  • Проверка на разных сеансах
  • предложите использовать sudo !!
  • и вернуть ошибку
if [ "$(whoami &2>/dev/null)" != "root" ] && [ "$(id -un &2>/dev/null)" != "root" ]
      then
      echo "You must be root to run this script!"
      echo "use 'sudo !!'"
      exit 1
fi
    
ответ дан rubo77 16.10.2014 в 11:17
1

Этот ответ - просто сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен скрипт, который запускается из графического интерфейса рабочего стола и требует прав root, попробуйте этот способ:

#!/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

Таким образом вы получите хорошее диалоговое окно с запросом пароля пользователя root. Как и с командной строки sudo.

gksudo может быть недоступно в вашей системе, а затем установить его с помощью sudo apt-get install gksu .

    
ответ дан gertas 18.10.2015 в 00:00