Bash Scripting: требуется скрипт для запуска с правами root (или с sudo)

26

Я пытаюсь написать скрипт bash (в Ubuntu), который будет создавать резервную копию каталога с помощью tar.

Как я могу выполнить проверку в сценарии, чтобы он мог запускаться только от имени пользователя root (или с помощью sudo)?

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

Я знаю, что должно быть простое решение, я просто не смог найти его, прибегая к помощи.

Кори Пластек
источник

Ответы:

37

Чтобы получить эффективный идентификатор пользователя, используйте эту команду:

id -u

Если результат равен «0», то сценарий либо выполняется от имени пользователя root, либо использует sudo. Вы можете запустить проверку, выполнив что-то вроде:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi
Скотт Пак
источник
5
Я бы рекомендовал полностью указать путь к идентификатору (например, / usr / bin / id). В противном случае хитрый пользователь может написать свой собственный скрипт / двоичный файл, который всегда возвращает 0, а затем поместить его в местоположение, которое существует ранее в пути исполняющих пользователей.
ktower
Согласовано. Исправление с правкой.
Скотт Пак
6
Любой «обманщик», пытающийся запустить скрипт, не будет остановлен вами, используя полный путь к идентификатору.
другой прием
Я согласен с другими ... это скрипт bash. Отбор бина 'id' не остановит никого, кто всерьез намеревается обойти чек. Лучше оставить его неквалифицированным для переносимости.
Крис
1
Это не соответствует требованию "sudo".
GregB
17

Я предполагаю, что вы знаете, что путем изменения владельца на root

chown root:root file

и установка разрешений до 700

chmod 700 file

Вы достигнете того же самого - без предложения бежать как sudo.

Но я выложу этот ответ для полноты.

казарка
источник
3
Это более подходящее решение, чем принятый ответ. - Мои $ 0,02
Крис
Примечание: проверка скрипта в git становится сложнее. Чтобы исправить,sudo git add <file>
Хаим Элия
2

Какова ваша цель здесь, чтобы информировать пользователей о том, что они должны запускать сценарий от имени пользователя root или в качестве меры предосторожности?

Если вы просто хотите сообщить пользователю, что любые предложения uid хороши, но они так же полезны, как шины на лошади, как мера предосторожности - ничто не мешает пользователю скопировать сценарий, вынеся оператор if, и запустить его в любом случае.

Если это проблема безопасности, сценарий должен быть установлен на 700, принадлежащий root: root, чтобы он не мог быть прочитан или выполнен другим пользователем.

theotherreceive
источник
Или это может быть сценарий, требующий доступа к файлам или командам, доступным только пользователю root, для выполнения своей работы, как в моем случае
chrisbunney
2

Вы также можете использовать команду whoami.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi
Кирил
источник
На самом деле uid 0 - это специальная учетная запись пользователя с полными привилегиями. «root» - это просто самая распространенная метка / имя, сопоставленное с этим UID. Это не обязательно должен быть root, и злоумышленник может попытаться использовать это.
0xSheepdog
2

Переменная bash $EUIDпоказывает эффективный UID, с которым работает скрипт, если вы хотите убедиться, что скрипт выполняется от имени пользователя root, проверьте, $EUIDсодержит ли значение 0 значение или нет:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

Это лучше, чем решение /usr/bin/idдля (для скриптов bash!), Потому что для него не требуется внешняя команда.

Neuhaus
источник
1
Вместо того, чтобы просто выйти, он может запросить у пользователя логин sudo, заменив echoстроку на sudo "$0" "$@"и заменив exit 2на exit $?.
schumacher574
Отличная идея. Однако этот вопрос задавался для сценария, который вышел, а не запускал sudo сам по себе.
Neuhaus
0

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

alexandre1985
источник
-1

«#! / bin / su root» позволяет пользователям в режиме суперпользователя запускать скрипт без использования пароля root. Если вы хотите, чтобы суперпользователи запускали скрипт с результатами, полученными от root, это будет сделано.

Lynnux
источник