Я пишу простой bash-скрипт, но он мне нужен, чтобы проверить, запускается ли он от имени root или нет. Я знаю, что, возможно, есть очень простой способ сделать это, но я понятия не имею, как.
Просто чтобы прояснить:
Какой простой способ написать скрипт foo.sh , так что команда ./foo.sh
выводит 0
и команду sudo ./foo.sh
выходы 1
?
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
Пользователь с правами 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
Так как @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
Принимая во внимание эффективность, вы можете проверить, сначала переменная среды EUID
, а затем, если она не существует, вызовите стандартную команду id
:
if ((${EUID:-0} || "$(id -u)")); then
echo You are not root.
else
echo Hello, root.
fi
Таким образом, из-за ярлыка ИЛИ , вы избегаете вызова системной команды, отдавая приоритет запросу переменной в памяти.
Повторное использование кода:
function amIRoot() {
! ((${EUID:-0} || "$(id -u)"))
}
Один простой способ сделать скрипт запускаемым только root - это запустить скрипт со строкой:
#!/bin/su root
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
echo 1
else
echo 0
fi
Этот фрагмент будет:
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
Этот ответ просто для того, чтобы сохранить идею, может быть полезен для некоторых из вас. Если вам нужен скрипт, который запускается из графического интерфейса рабочего стола и требует привилегий 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
.
Вы можете выполнить это с помощью команды whoami
, которая возвращает текущего пользователя:
#!/bin/bash
if [ `whoami` != 'root' ]
then
echo "You must be root to do this."
exit
fi
...
Выполнение вышеприведенной команды напечатает Для этого вы должны быть корневым пользователем.
, если текущий пользователь не является root
.
Примечание: в некоторых случаях альтернативой может быть просто проверка переменной $USER
:
if [ $USER != 'root' ]
Этот код работает как под 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