Как проверить, работает ли с правами root в bash script
Я пишу script, который требует прав на уровне корневого уровня, и я хочу сделать так, чтобы, если script не запущен как root, он просто перекликается с "Пожалуйста, запустите от имени пользователя root". и выходы.
Здесь некоторый псевдокод для того, что я ищу:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
Как я могу (чище и безопасно) справиться с этим? Спасибо!
А, просто для того, чтобы уточнить: часть (сделайте что-то) будет включать в себя запуск команд, которые сами по себе требуют root. Так что запуск его, как обычный пользователь, просто придумал бы ошибку. Это просто предназначено для чистого запуска script, для которого требуются корневые команды, без использования sudo внутри script, я просто ищу какой-то синтаксический сахар.
Ответы
Ответ 1
Было дано несколько ответов, но, по-видимому, лучшим способом является использование:
-
id -u
- Если запустить с правами root, вернет идентификатор 0.
Это кажется более надежным, чем другие методы, и кажется, что он возвращает id из 0, даже если script выполняется через sudo
.
Ответ 2
Переменная среды $ EUID содержит текущий UID пользователя. Root UID равен 0. Используйте что-то вроде этого в вашем скрипте:
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
Примечание: Если вы получаете 2: [: Illegal number:
проверьте, есть ли у вас #!/bin/sh
вверху и измените его на #!/bin/bash
.
Ответ 3
В bash script у вас есть несколько способов проверить, является ли текущий пользователь root.
Как предупреждение , не проверяйте, является ли пользователь root, используя имя пользователя root
. Ничто не гарантирует, что пользователь с ID 0 называется root
. Это очень сильное соглашение, которое широко применяется, но любой может переименовать суперпользователя в другое имя.
Я думаю, что лучший способ использования bash - использовать $EUID
, с man-страницы:
EUID Expands to the effective user ID of the current user, initialized
at shell startup. This variable is readonly.
Это лучший способ, чем $UID
, который может быть изменен и не отражает реального пользователя, запускающего script.
if (( $EUID != 0 )); then
echo "Please run as root"
exit
fi
Способ, которым я подхожу к этой проблеме, заключается в том, чтобы вставлять sudo
в мои команды, когда он не запускается с правами root. Вот пример:
SUDO=''
if (( $EUID != 0 )); then
SUDO='sudo'
fi
$SUDO a_command
Таким образом моя команда запускается root при использовании суперпользователя или sudo
при запуске обычного пользователя.
Если ваш script всегда должен быть запущен root, просто установите права соответственно (0500
).
Ответ 4
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
или
if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
:)
Ответ 5
Как упоминает @wrikken в своих комментариях, id -u
- это гораздо лучшая проверка для root.
Кроме того, при правильном использовании sudo
вы можете проверить script и посмотреть, работает ли он с правами root. Если нет, попросите его вспомнить через sudo
, а затем запустите с правами root.
В зависимости от того, что делает script, другой может быть настройка записи sudo
для любых специализированных команд, которые могут понадобиться script.
Ответ 6
Существует простая проверка для пользователя, являющегося пользователем root.
Синтаксис [[ stuff ]]
- это стандартный способ запуска проверки в bash.
error() {
printf '\E[31m'; echo "[email protected]"; printf '\E[0m'
}
if [[ $EUID -eq 0 ]]; then
error "This script should not be run using sudo or as the root user"
exit 1
fi
Это также предполагает, что вы хотите выйти с 1, если вы терпите неудачу. Функция error
- это некоторое чутье, которое устанавливает выходной текст в красный (не нужен, но довольно классный, если вы меня спрашиваете).
Ответ 7
0- Прочитайте официальную документацию GNU Linux, есть много способов сделать это правильно.
1- убедитесь, что вы помещаете подпись оболочки, чтобы избежать ошибок в интерпретации:
#!/bin/bash
2- это мой script
#!/bin/bash
if [[ $EUID > 0 ]]; then # we can compare directly with this syntax.
echo "Please run as root/sudo"
exit 1
else
#do your stuff
fi
Ответ 8
Очень простой способ просто поставить:
if [ "$(whoami)" == "root" ] ; then
# you are root
else
# you are not root
fi
Преимущество использования этого вместо id
заключается в том, что вы можете проверить, не работает ли какой-либо пользователь, не являющийся пользователем root; например.
if [ "$(whoami)" == "john" ] ; then
# you are john
else
# you are not john
fi
Ответ 9
Если script действительно требует доступа к корню, тогда его права на файлы должны отражать это. Наличие корневого script исполняемого пользователями, не являющимся пользователем root, будет красным. Я рекомендую вам не контролировать доступ с помощью проверки if
.
chown root:root script.sh
chmod u=rwx,go=r script.sh
Ответ 10
В этом ответе, чтобы было ясно, я предполагаю, что читатель может читать сценарии оболочки bash
и POSIX, такие как dash
.
Я полагаю, что здесь мало что можно объяснить, потому что ответы с большим количеством голосов объясняют многое из этого.
Тем не менее, если есть что-то, чтобы объяснить дальше, не стесняйтесь комментировать, я сделаю все возможное, чтобы заполнить пробелы.
Оптимизированное bash
решение для производительности и надежности
#!/bin/bash
is_user_root()
# function verified to work on Bash version 4.4.18
# both as root and with sudo; and as a normal user
{
! (( ${EUID:-0} || $(id -u) ))
}
if is_user_root; then
echo 'You are the almighty root!'
else
echo 'You are just an ordinary user.'
fi
Объяснение
Так как чтение переменной bash
стандарта во много раз быстрее, эффективный идентификатор пользователя, чем выполнение команды id -u
для POSIX -ly, находит пользователя ID, это решение объединяет оба в красиво упакованную функцию. Если и только если $EUID
по какой-либо причине недоступен, команда id -u
будет выполнена, гарантируя, что мы получим правильное возвращаемое значение независимо от обстоятельств.
Почему я публикую это решение после стольких лет, когда ОП спросил
Что ж, если я правильно вижу, кажется, что выше отсутствует фрагмент кода.
Видите ли, есть много переменных, которые необходимо учитывать, и одна из них сочетает в себе производительность и надежность.
Портативное решение POSIX solution
#!/bin/sh
is_user_root()
# function verified to work on Dash version 0.5.8
# both as root and with sudo; and as a normal user
{
[ "$(id -u)" -eq 0 ]
}
if is_user_root; then
echo 'You are the almighty root!'
else
echo 'You are just an ordinary user.'
fi
Заключение
Как бы вам это ни нравилось, среда Unix/Linux очень разнообразна. Это означает, что есть люди, которым так нравится bash
, что они даже не думают о переносимости (POSIX оболочки). Другие, как я, предпочитают POSIX оболочки. В настоящее время это вопрос личного выбора и потребностей.
Ответ 11
попробуйте следующий код:
if [ "$(id -u)" != "0" ]; then
echo "Sorry, you are not root."
exit 1
fi
ИЛИ
if [ `id -u` != "0" ]; then
echo "Sorry, you are not root."
exit 1
fi
Ответ 12
Один простой способ сделать скрипт доступным только для пользователя root - запустить скрипт со строкой:
#!/bin/su root
Ответ 13
Насколько я знаю, правильный способ проверить это:
if [ $(id -u) = "0" ]; then
echo "You are root"
else
echo "You are NOT root"
fi
Смотрите раздел "Тестирование на корень" здесь:
http://linuxcommand.org/lc3_wss0080.php
Ответ 14
id -u
намного лучше, чем whoami
, поскольку некоторые системы, такие как android, могут не предоставлять слово root.
Пример:
# whoami
whoami
whoami: unknown uid 0
Ответ 15
Проверьте, являетесь ли вы пользователем root, и выйдите из системы, если вы не:
if ((EUID != 0)); then
echo "Root or Sudo Required for script ( $(basename $0) )"
exit
fi
Или в этом примере попытайтесь создать каталог в корневом расположении, а затем попытайтесь после повышения прав.
Проверьте, являетесь ли вы пользователем root и, если возможно, не повышать его:
# Fails to create these dirs (needs sudo)
mkdir /test-dir-$(basename $0)
rmdir /test-dir-$(basename $0)
if ((EUID != 0)); then
echo "Granting root privileges for script ( $(basename $0) )"
if [[ -t 1 ]]; then
sudo "$0" "[email protected]"
else
exec 1> output_file
gksu "$0" "[email protected]"
fi
exit
fi
echo "Root privileges granted..."
# Creates Dirs as it now has rights
mkdir /test-dir-$(basename $0)
rmdir /test-dir-$(basename $0)
Ответ 16
#!/bin/bash
# GNU bash, version 4.3.46
# Determine if the user executing this script is the root user or not
# Display the UID
echo "Your UID is ${UID}"
if [ "${UID}" -eq 0 ]
then
echo "You are root"
else
echo "You are not root user"
fi
Примечание редактора: если вам не нужны двойные скобки, используйте одинарные для переносимости кода.
Ответ 17
Проверьте наличие рута:
ROOT_UID=0 # Root has $UID 0.
if [ "$UID" -eq "$ROOT_UID" ]
then
echo "You are root."
else
echo "You are just an ordinary user."
fi
exit 0
Протестировано и работает в корне.