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

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

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

#!/bin/bash
if [[ $EUID -ne 0 ]]; затем
повторите "Этот скрипт должен быть запущен от имени root" 
   выход 1
fi

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

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

id -u

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

Тесты

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

rootxroot2

Вошел в систему как root2, дает следующие результаты:

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

Обновленный сценарий будет выглядеть следующим образом:

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

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

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

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

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

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

#!/bin/bashif [ `whoami` != 'root' ]  then    echo "You must be root to do this."    exitfi...

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


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

if [ $USER != 'root' ]

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

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

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

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

function amIRoot() {  ! ((${EUID:-0} || "$(id -u)"))}
<код>#!/bin/bash
[[ $(id -u) != 0 ]] 
эхо $?

<пре><код>#!/ бин/голова
если [$(id -u)" = = " 0"]
может быть
Эхо & quot;и am root.убежать;
развесистый
echo " I am not root.убежать;
промежуточный
< / коде>< / пре>

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

  • Проверка на разных сеансах
  • предлагаю использовать sudo !!
  • и возвращает сообщение об ошибке
>>если [ "$(whoami &2/dev/null)" != "root" ] && [ "$(id -un &2/dev/null)" != "root" ], то повторите: "Вы должны быть root, чтобы запустить этот скрипт!"      echo "use 'sudo !!'" выход 1fi

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

#!/bin/bashif ! [ $(id -u) = 0 ]; then   gksudo -w $0 $@   exitfi#here go superuser commands, e.g. (switch intel cpu into powersave mode):echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbocpupower frequency-set -g powersave

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

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

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