Я пишу сценарий, который требует разрешения корневого уровня, и я хочу сделать так, чтобы, если сценарий не запускался от имени пользователя root, он просто повторял «Пожалуйста, запустите от имени пользователя root». и выходит.
Вот некоторый псевдокод для того, что я ищу:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
Как я могу лучше всего (чисто и безопасно) достичь этого? Спасибо!
Ах, просто чтобы уточнить: часть (делать вещи) будет включать запуск команд, которые сами по себе требуют root. Поэтому запуск его как обычного пользователя может привести к ошибке. Это просто предназначено для аккуратного запуска скрипта, требующего корневых команд, без использования sudo внутри скрипта, я просто ищу синтаксический сахар.
id -u
возвращает0
root.Ответы:
Переменная среды $ EUID содержит UID текущего пользователя. UID Root равен 0. Используйте что-то вроде этого в вашем скрипте:
Примечание: если вы получили,
2: [: Illegal number:
проверьте, если у вас есть#!/bin/sh
в верхней части и измените его на#!/bin/bash
.источник
2: [: Illegal number:
предупреждение, пока не изменил его на версию Серхио.then
находится в той же строке, что и условие ...В bash-скрипте у вас есть несколько способов проверить, является ли запущенный пользователь root.
В качестве предупреждения не проверяйте, является ли пользователь root, используя
root
имя пользователя. Ничто не гарантирует, что пользователь с идентификатором 0 вызываетсяroot
. Это очень строгое соглашение, которому широко следуют, но любой может переименовать суперпользователя в другое имя.Я думаю, что лучший способ при использовании bash - использовать
$EUID
со страницы руководства:Это лучший способ,
$UID
который может быть изменен и не отражать реального пользователя, выполняющего скрипт.Я подхожу к такой проблеме, вводя
sudo
свои команды, когда они не запускаются от имени пользователя root. Вот пример:Таким образом, моя команда запускается пользователем root при использовании суперпользователя или
sudo
обычным пользователем.Если ваш скрипт всегда должен запускаться пользователем root, просто установите соответствующие права (
0500
).источник
printf $EUID
sudo или нет, я получаю свой UID обратно. Если я использую,id -u
я получаю свой UID, и когда я вызываю его с помощью sudo, я получаю 0 обратно. Я сделал что-то не так?sudo bash <<<'echo $EUID'
сbash <<<'echo $EUID'
. Больше о heredoc-подобной Herestring на tldp.org/LDP/abs/html/x17837.htmlБыло дано несколько ответов, но, похоже, что лучший способ использовать это:
id -u
Это кажется более надежным, чем другие методы, и кажется, что он возвращает идентификатор 0, даже если сценарий выполняется
sudo
.источник
или
:)
источник
sudo
я могу просто напечатать,sudo !!
и это делает работу за меня, вместо того, чтобы нажимать стрелку ВВЕРХ, переходить к началу строки и добавлятьsudo
вручную. Не уверен, что это вещь BASH или SUDO, но она работает почти все время.if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi
. Приветствия.Как упомянул @wrikken в своих комментариях,
id -u
гораздо лучше проверять наличие root.Кроме того, при правильном использовании
sudo
вы можете проверить скрипт и посмотреть, работает ли он от имени root. Если нет, сделайте так, чтобы он вызывал себя через,sudo
а затем запускал с правами root.В зависимости от того, что делает скрипт, другой вариант может заключаться в том, чтобы настроить
sudo
запись для любых специальных команд, которые могут понадобиться скрипту.источник
$0
у меня есть имя запущенного скрипта. Есть несколько примеров здесь , которые могут помочь вам.Существует простая проверка для пользователя, являющегося пользователем root.
[[ stuff ]]
Синтаксис стандартный способ запуска проверки в Баш.Это также предполагает, что вы хотите выйти с 1 в случае неудачи.
error
Функция некоторое чутье , что наборы вывод текст на красный (не требуется, но довольно классный , если вы спросите меня).источник
error
команда? Моя система, кажется, не имеет его. , ,less
или еще что-нибудь); и (4) установить цвет фона, чтобы текст можно было читать независимо от цвета фона терминала пользователя. Итак, как-то такfunction error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }
. (Tweak по желанию.)Очень простой способ просто положить:
Преимущество использования этого вместо того
id
, что вы можете проверить, выполняет ли команда также определенный не-root пользователь; например.источник
whoami
а не с использованиемid
;whoami
команда также может быть использована для проверки других пользователей , чем корень, по имени.0- Читайте официальную документацию по GNU Linux, есть много способов сделать это правильно.
1- убедитесь, что вы поставили подпись оболочки, чтобы избежать ошибок при интерпретации:
2- это мой сценарий
источник
В этом ответе, пусть будет ясно, я предполагаю, что читатель умеет читать
bash
и сценарии оболочки POSIX, какdash
.Я полагаю, что здесь не так много объяснений, так как высоко голосованные ответы хорошо объясняют многое из этого.
Тем не менее, если есть что-то, чтобы объяснить дальше, не стесняйтесь комментировать, я сделаю все возможное, чтобы заполнить пробелы.
Оптимизированное универсальное (не только
) решение для производительности и надежности; совместимы все оболочкиbash
Новое решение:
Тест (сохранить в файл
is_user_root__benchmark
)Оригинальное решение:
^^^ Было доказано, что зачеркнутое решение не ускоряет процесс, но оно существует уже давно, поэтому я буду держать его здесь до тех пор, пока сочту необходимым.
объяснение
Так как читать
$EUID
стандартнуюbash
переменную в разы быстрее , эффективный номер идентификатора пользователя, чем выполнениеid -u
команды для POSIX, - просто найти идентификатор пользователя, это решение объединяет оба в красиво упакованную функцию. Если и только если$EUID
по какой-либо причине недоступно,id -u
команда будет выполнена, гарантируя, что мы получим правильное возвращаемое значение независимо от обстоятельств .Почему я публикую это решение после стольких лет, когда ФП спросил
Что ж, если я правильно вижу, кажется, что выше отсутствует фрагмент кода.
Видите ли, есть много переменных, которые должны быть приняты во внимание, и одна из них сочетает в себе производительность и надежность .
Портативное решение POSIX + Пример использования вышеуказанной функции
Вывод
Как бы вам это ни нравилось, среда Unix / Linux очень разнообразна. Это означает, что есть люди, которые
bash
так любят , что даже не думают о переносимости ( POSIX- оболочки). Другие, как я, предпочитают оболочки POSIX . В настоящее время это вопрос личного выбора и потребностей.источник
Если сценарию действительно требуется доступ с правами root, это должно отражать его права доступа к файлу. Наличие корневого скрипта, выполняемого пользователями без полномочий root, будет красным флагом. Я призываю вас не контролировать доступ с помощью
if
чека.источник
777
бомбы делает эту проверку немного ошибочной для тех пользователей, которые в первую очередь допустят ошибку.bash /path/to/script
его все равно можноo=r
Один простой способ сделать скрипт доступным только для пользователя root - запустить скрипт со строкой:
#!/bin/su root
источник
exit
? И все же за эти ответы проголосовали? Я предполагаю, что люди неявно не хотят, чтобы скрипт запускался как root. Так что я придерживаюсь этого способа мышления с более простым ответом. Но да, вы также можете узнать из более подробных ответов вышепопробуйте следующий код:
ИЛИ
источник
Насколько я знаю, правильный способ проверить это:
Смотрите раздел «Тестирование на корень» здесь:
http://linuxcommand.org/lc3_wss0080.php
источник
= "0"
на-eq 0
id -u
гораздо лучше, чемwhoami
, так как некоторые системы, такие как Android, могут не предоставлять слово root.Пример:
источник
Проверьте, являетесь ли вы пользователем root, и выйдите, если вы не:
Или в этом примере попробуйте создать каталог в корневом расположении, а затем попробуйте после повышения прав.
Проверьте, являетесь ли вы пользователем root и, если нет, повышайте его, если возможно
источник
Примечание редактора: если вам не нужны двойные скобки, используйте одинарные для переносимости кода.
источник
Проверьте наличие рута:
Протестировано и работает в корне.
источник