Я пишу простой скрипт bash, но он мне нужен, чтобы проверить, запускается ли он от имени root или нет. Я знаю, что, вероятно, есть очень простой способ сделать это, но я понятия не имею, как это сделать.
Просто для ясности: Каков простой способ написать сценарий foo.sh, так что команда ./foo.sh выходы 0, и команда sudo ./foo.sh выходы 1?
Пользователь 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
Принимая во внимание эффективность, вы можете сначала протестировать EUID переменную среды, а затем, если она не существует, вызовите стандартную id команда:
if ((${EUID:-0} || "$(id -u)")); then echo You are not root.else echo Hello, root.fi
Таким образом, из-за ИЛИ ярлык, вы избегаете вызова системной команды, отдавая приоритет запросу переменной в памяти.
Повторное использование кода:
function amIRoot() { ! ((${EUID:-0} || "$(id -u)"))}
<пре><код>#!/ бин/голова
если [$(id -u)" = = " 0"]
может быть
Эхо & quot;и am root.убежать;
развесистый
echo " I am not root.убежать;
промежуточный
< / коде>< / пре>
Этот ответ предназначен только для того, чтобы сохранить идею, которая может оказаться полезной для некоторых из вас.Если вам нужен скрипт, который запускается из графического интерфейса рабочего стола и требует прав суперпользователя, попробуйте этот способ:
#!/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.