Как проверить, работает ли с правами 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

Протестировано и работает в корне.