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

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

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

160
задан 2 December 2010 в 14:30

11 ответов

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
193
ответ дан 2 December 2010 в 14:30

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

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

id -u

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

Тесты

/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
132
ответ дан 2 December 2010 в 14:30
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
9
ответ дан 2 December 2010 в 14:30

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

#!/bin/bash

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

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

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi
35
ответ дан 2 December 2010 в 14:30

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

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

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

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

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
11
ответ дан 2 December 2010 в 14:30

Один простой способ сделать скрипт запускаемым только root - это запустить скрипт со строкой:
#!/bin/su root

2
ответ дан 2 December 2010 в 14:30
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
2
ответ дан 2 December 2010 в 14:30

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

  • Проверять в разных сеансах
  • предлагать использовать 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
2
ответ дан 2 December 2010 в 14:30

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

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

В этом случае вы получите красивое диалоговое окно, спрашивающее пароль root пользователя. Как и в случае с командной строкой sudo.

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

2
ответ дан 2 December 2010 в 14:30

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

#!/bin/bash

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

...

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


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

if [ $USER != 'root' ]
21
ответ дан 2 December 2010 в 14:30

Этот код работает как под Bash, так и под стандартным Bourne sh (протестирован под FreeBSD), который не определяет EUID. Если EUID существует, возвращается его значение, в противном случае выполняется команда id. Он немного короче, чем пример "или" выше, поскольку в нем используется встроенная оболочка ": -".

Корень в sh:

# echo $EUID

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

In bash:
[chaapala@tenfwd2 ese]$ euid=${EUID:-`id -u`}
[chaapala@tenfwd2 ese]$ echo $euid
10260
1
ответ дан 22 November 2019 в 23:00

Другие вопросы по тегам:

Похожие вопросы: