Как требовать привилегии root для запуска команды или псевдонима? [dубликат]

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

Просто чтобы быть ясным: что такое простой способ написать скрипт foo.sh, так что команда ./foo.sh выходы 0, а команда sudo ./foo.sh выдает 1?

83
задан 2 December 2010 в 15:30

73 ответа

[F1]
107
ответ дан 25 July 2018 в 04:19
  • 1
    Я принимаю эту причину (после некоторого тестирования) с использованием системной переменной EUID, которая оказалась (примерно в 100 раз) быстрее, чем запуск команды (id -u), но все ответы работали отлично. – Malabarba 2 December 2010 в 15:59
  • 2
    Кроме того, $UID и $EUID являются багизмами. У простых оболочек, совместимых с POSIX, нет этих переменных, и вам нужно использовать id(1) . – David Foerster 16 October 2014 в 14:28
  • 3
    в сценарии bash вы можете использовать if ((EUID)); then, см. комментарий @ geirha – jfs 18 October 2014 в 00:38
  • 4
    @Andrew: переменные заменяются до их передачи в sudo. Если вы запустите sudo sh -c 'echo $EUID', вы увидите ожидаемые результаты. – M. Dudley 19 November 2015 в 22:09
  • 5
    @Andrew - я знаю, что я здесь поздно, но для потомков: $EUID - это башизм (как упоминалось выше @DavidFoerster), а ваш /bin/sh, скорее всего, является ссылкой на /bin/dash, а не /bin/bash , sudo bash -c 'echo $EUID' даст ожидаемый результат. – Adrian Günter 10 May 2017 в 00:40
[F1]
109
ответ дан 1 August 2018 в 06:31
  #! / bin / bash, если [[$ EUID -ne 0]];  затем echo «Этот скрипт должен быть запущен как root» exit 1 fi  
110
ответ дан 3 August 2018 в 02:30
  #! / bin / bash, если [[$ EUID -ne 0]];  затем echo «Этот скрипт должен быть запущен как root» exit 1 fi  
110
ответ дан 4 August 2018 в 04:19
  #! / bin / bash, если [[$ EUID -ne 0]];  затем echo «Этот скрипт должен быть запущен как root» exit 1 fi  
111
ответ дан 5 August 2018 в 11:48
  #! / bin / bash, если [[$ EUID -ne 0]];  затем echo «Этот скрипт должен быть запущен как root» exit 1 fi  
111
ответ дан 7 August 2018 в 05:29
  #! / bin / bash, если [[$ EUID -ne 0]];  затем echo «Этот скрипт должен быть запущен как root» exit 1 fi  
111
ответ дан 9 August 2018 в 10:44
  #! / bin / bash, если [[$ EUID -ne 0]];  затем echo «Этот скрипт должен быть запущен как root» exit 1 fi  
114
ответ дан 15 August 2018 в 05:19
  • 1
    Я принимаю эту причину (после некоторого тестирования) с использованием системной переменной EUID, которая оказалась (примерно в 100 раз) быстрее, чем запуск команды (id -u), но все ответы работали отлично. – Malabarba 2 December 2010 в 15:59
  • 2
    Кроме того, $ UID и $ EUID - это базисы. У простых оболочек, совместимых с POSIX, нет этих переменных, и вам нужно использовать id (1) . – David Foerster 16 October 2014 в 14:28
  • 3
    в сценарии bash вы можете использовать , если ((EUID)); затем , см. комментарий @ geirha – jfs 18 October 2014 в 00:38
  • 4
    @Andrew: переменные заменяются до их передачи в sudo . Если вы запустите sudo sh -c 'echo $ EUID' , вы увидите ожидаемые результаты. – M. Dudley 19 November 2015 в 22:09
  • 5
    @Andrew - Я знаю, что я здесь поздно, но для потомков: $ EUID - это башизм (как упоминалось выше @DavidFoerster), а ваш / bin / sh скорее всего, является ссылкой на / bin / dash , а не / bin / bash . sudo bash -c 'echo $ EUID' даст ожидаемый результат. – Adrian Günter 10 May 2017 в 00:40

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

3
ответ дан 25 July 2018 в 04:19
[F1]
1
ответ дан 25 July 2018 в 04:19
  • 1
    В общем случае следует использовать ((..)) для тестирования чисел и [[..]] для тестирования строк и файлов, поэтому я бы сделал if (( EUID != 0 )); then или просто if ((EUID)); then – geirha 13 March 2011 в 16:41
  • 2
    @geirha: Я добавил ваше предложение. – jfs 13 March 2011 в 17:11
  • 3
    EUID должен стать $EUID. Вместо использования (( $EUID != 0 )) используйте [ $EUID != 0 ]. Он будет работать и с dash. – Lekensteyn 13 March 2011 в 17:23
  • 4
    @Lekensteyn: EUID работает отлично. Вопрос помечен bash не dash. Команда env -i sh -c '[ $EUID != 0 ]' не работает, но env -i bash -c '(( EUID != 0 ))' работает. btw, dash не работает для некоторых символов не-ascii на Ubuntu stackoverflow.com/questions/5160125/… Это 2011 год, и есть люди, которые используют другие языки. – jfs 13 March 2011 в 17:39
  • 5
    Оглядываясь на это, будучи ужасно скучным и тестируя, я собираюсь использовать этот метод, как показано здесь, с материалом $EUID с этого момента. В результате я принял принятый ответ. – Thomas Ward♦ 3 August 2011 в 20:15

Этот ответ заключается только в том, чтобы сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен сценарий, который запускается из графического интерфейса рабочего стола и требует прав 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 недоступен в вашей системе, а затем установите его с помощью sudo apt-get install gksu.

1
ответ дан 25 July 2018 в 04:19
[F1]
9
ответ дан 25 July 2018 в 04:19

Пользователь root не должен называться «root». whoami возвращает первое имя пользователя с идентификатором пользователя 0. $USER содержит имя зарегистрированного пользователя, который может иметь идентификатор пользователя 0, но имеет другое имя.

Единственная надежная программа для проверки, зарегистрирована ли учетная запись как root, или not:

id -u

Я использую -u для эффективного идентификатора пользователя, а не -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
94
ответ дан 25 July 2018 в 04:19
  • 1
    Хороший анализ. +1 за информативный бонус – lazyPower 13 March 2011 в 13:21
  • 2
    Вам не нужно id -u в bash askubuntu.com/questions/30148/… – jfs 13 March 2011 в 14:27
  • 3
    Я всегда стараюсь оставаться максимально совместимым с POSIX, используя sh (dash) в качестве интерпретатора вместо bash. Но хороший выстрел, спасает еще одну вилку :) – Lekensteyn 13 March 2011 в 14:34
  • 4
    Некоторое время от холода я вернулся и посмотрел. Метод Лекенштейна действительно выглядит лучше. Теперь его ответ - новый принятый ответ. +1 к вам, Лекенштейн, особенно. для того, чтобы получить этот труднодоступный значок от этого вопроса;) – Thomas Ward♦ 13 March 2011 в 22:13
  • 5
    Я видел более короткие версии, [ -w / ]. Идея остается прежней. Примечание: в определенных chroots [ -w /etc/shadow ] не будет работать, потому что /etc/shadow не существует, поэтому подход с / является предпочтительным. Лучше бы проверить фактическую потребность в корневых разрешениях. Если скрипту необходимо записать в /etc/someconfig, просто проверьте, доступен ли этот файл для записи, или файл не существует, и /etc доступен для записи. – Lekensteyn 15 March 2011 в 02:47

Принимая во внимание эффективность, вы можете сначала проверить переменную среды EUID, а затем, если она не существует, вызовите стандартную команду id:

if ((${EUID:-0} || "$(id -u)")); then echo You are not root. else echo Hello, root. fi

Таким образом , из-за ярлыка OR, вы избегаете вызова системной команды, предварительно задавая запрос переменной в памяти.

Повторное использование кода:

function amIRoot() { ! ((${EUID:-0} || "$(id -u)")) }
6
ответ дан 25 July 2018 в 04:19

Вы можете выполнить это, используя команду whoami, которая возвращает текущего пользователя:

#!/bin/bash if [ `whoami` != 'root' ] then echo "You must be root to do this." exit fi ...

Запуск выше будет печатать You must be root to do this., если текущий пользователь не root. [ ! d1]

Примечание: альтернативой в некоторых случаях является просто проверка переменной $USER:

if [ $USER != 'root' ]
18
ответ дан 25 July 2018 в 04:19
  • 1
    Я посмотрю код, посмотрю, не сработает ли сценарий или что-то в этом роде. Если это сработает, я приму свой ответ :) – Thomas Ward♦ 13 March 2011 в 11:40
  • 2
    Положите это в мои скрипты, он работал красиво. Большое спасибо. :) – Thomas Ward♦ 13 March 2011 в 11:42
  • 3
    @George Edison: Я рекомендую не использовать $USER, особенно таким образом. $USER задается оболочкой входа, она не обязательно распространяется на программу (env -i sh -c 'echo $USER'). Таким образом, $USER пуст и возникает синтаксическая ошибка. – Lekensteyn 13 March 2011 в 13:26
  • 4
    @Lekensteyn Не только $USER устанавливается оболочкой, но и легко подделывается. Whoami вернет фактического пользователя. – Paul de Vrieze 13 March 2011 в 15:48
  • 5
    @PauldeVrieze Какой смысл обманывать эту проверку? – htorque 13 March 2011 в 18:01

Этот фрагмент будет:

Проверять разные сеансы, предлагая использовать 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
1
ответ дан 25 July 2018 в 04:19

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

3
ответ дан 1 August 2018 в 06:31
[F1]
28
ответ дан 1 August 2018 в 06:31
  • 1
    В общем случае следует использовать ((..)) для тестирования чисел и [[..]] для тестирования строк и файлов, поэтому я бы сделал if (( EUID != 0 )); then или просто if ((EUID)); then – geirha 13 March 2011 в 16:41
  • 2
    @geirha: Я добавил ваше предложение. – jfs 13 March 2011 в 17:11
  • 3
    EUID должен стать $EUID. Вместо использования (( $EUID != 0 )) используйте [ $EUID != 0 ]. Он будет работать и с dash. – Lekensteyn 13 March 2011 в 17:23
  • 4
    @Lekensteyn: EUID работает отлично. Вопрос помечен bash не dash. Команда env -i sh -c '[ $EUID != 0 ]' не работает, но env -i bash -c '(( EUID != 0 ))' работает. btw, dash не работает для некоторых символов не-ascii на Ubuntu stackoverflow.com/questions/5160125/… Это 2011 год, и есть люди, которые используют другие языки. – jfs 13 March 2011 в 17:39
  • 5
    Оглядываясь на это, будучи ужасно скучным и тестируя, я собираюсь использовать этот метод, как показано здесь, с материалом $EUID с этого момента. В результате я принял принятый ответ. – Thomas Ward♦ 3 August 2011 в 20:15

Этот ответ заключается только в том, чтобы сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен сценарий, который запускается из графического интерфейса рабочего стола и требует прав 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 недоступен в вашей системе, а затем установите его с помощью sudo apt-get install gksu.

1
ответ дан 1 August 2018 в 06:31
[F1]
9
ответ дан 1 August 2018 в 06:31

Пользователь root не должен называться «root». whoami возвращает первое имя пользователя с идентификатором пользователя 0. $USER содержит имя зарегистрированного пользователя, который может иметь идентификатор пользователя 0, но имеет другое имя.

Единственная надежная программа для проверки, зарегистрирована ли учетная запись как root, или not:

id -u

Я использую -u для эффективного идентификатора пользователя, а не -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
94
ответ дан 1 August 2018 в 06:31
  • 1
    Хороший анализ. +1 за информативный бонус – lazyPower 13 March 2011 в 13:21
  • 2
    Вам не нужно id -u в bash askubuntu.com/questions/30148/… – jfs 13 March 2011 в 14:27
  • 3
    Я всегда стараюсь оставаться максимально совместимым с POSIX, используя sh (dash) в качестве интерпретатора вместо bash. Но хороший выстрел, спасает еще одну вилку :) – Lekensteyn 13 March 2011 в 14:34
  • 4
    Некоторое время от холода я вернулся и посмотрел. Метод Лекенштейна действительно выглядит лучше. Теперь его ответ - новый принятый ответ. +1 к вам, Лекенштейн, особенно. для того, чтобы получить этот труднодоступный значок от этого вопроса;) – Thomas Ward♦ 13 March 2011 в 22:13
  • 5
    Я видел более короткие версии, [ -w / ]. Идея остается прежней. Примечание: в определенных chroots [ -w /etc/shadow ] не будет работать, потому что /etc/shadow не существует, поэтому подход с / является предпочтительным. Лучше бы проверить фактическую потребность в корневых разрешениях. Если скрипту необходимо записать в /etc/someconfig, просто проверьте, доступен ли этот файл для записи, или файл не существует, и /etc доступен для записи. – Lekensteyn 15 March 2011 в 02:47

Принимая во внимание эффективность, вы можете сначала проверить переменную среды EUID, а затем, если она не существует, вызовите стандартную команду id:

if ((${EUID:-0} || "$(id -u)")); then echo You are not root. else echo Hello, root. fi

Таким образом , из-за ярлыка OR, вы избегаете вызова системной команды, предварительно задавая запрос переменной в памяти.

Повторное использование кода:

function amIRoot() { ! ((${EUID:-0} || "$(id -u)")) }
6
ответ дан 1 August 2018 в 06:31

Вы можете выполнить это, используя команду whoami, которая возвращает текущего пользователя:

#!/bin/bash if [ `whoami` != 'root' ] then echo "You must be root to do this." exit fi ...

Запуск выше будет печатать You must be root to do this., если текущий пользователь не root. [ ! d1]

Примечание: альтернативой в некоторых случаях является просто проверка переменной $USER:

if [ $USER != 'root' ]
18
ответ дан 1 August 2018 в 06:31
  • 1
    Я посмотрю код, посмотрю, не сработает ли сценарий или что-то в этом роде. Если это сработает, я приму свой ответ :) – Thomas Ward♦ 13 March 2011 в 11:40
  • 2
    Положите это в мои скрипты, он работал красиво. Большое спасибо. :) – Thomas Ward♦ 13 March 2011 в 11:42
  • 3
    @George Edison: Я рекомендую не использовать $USER, особенно таким образом. $USER задается оболочкой входа, она не обязательно распространяется на программу (env -i sh -c 'echo $USER'). Таким образом, $USER пуст и возникает синтаксическая ошибка. – Lekensteyn 13 March 2011 в 13:26
  • 4
    @Lekensteyn Не только $USER устанавливается оболочкой, но и легко подделывается. Whoami вернет фактического пользователя. – Paul de Vrieze 13 March 2011 в 15:48
  • 5
    @PauldeVrieze Какой смысл обманывать эту проверку? – htorque 13 March 2011 в 18:01

Этот фрагмент будет:

Проверять разные сеансы, предлагая использовать 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
1
ответ дан 1 August 2018 в 06:31

Этот фрагмент будет:

  • Проверить разные сессии
  • предложить использовать sudo !!
  • и вернуться ошибка
, если ["$ (whoami & 2> / dev / null)"! = "root"] && ["$ (id -un & 2> / dev / null)"!  = "root"] then echo "Вы должны быть root для запуска этого скрипта!"  echo "use 'sudo !!'" exit 1 fi 
1
ответ дан 3 August 2018 в 02:30

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

3
ответ дан 3 August 2018 в 02:30
  #! / bin / bash uid = `id -u`, если [" $ uid "==" 0 "], тогда echo 1 else echo 0 fi  
28
ответ дан 3 August 2018 в 02:30

Этот ответ - просто сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен скрипт, который запускается из графического интерфейса рабочего стола и требует прав root, попробуйте этот способ:

  #! / Bin / bash if!  [$ (id -u) = 0];  затем gksudo -w $ 0 $ @ exit fi #here идут команды суперпользователя, например.  (переключить процессор Intel в режим энергосбережения): echo 1 & gt;  / sys / devices / system / cpu / intel_pstate / no_turbo cpupower frequency-set -g powersave  

Таким образом вы получите красивое диалоговое окно с запросом пароля пользователя root.

gksudo может быть недоступен в вашей системе, а затем установить его с помощью sudo apt-get install gksu . [ ! d5]

1
ответ дан 3 August 2018 в 02:30
  #! / bin / bash [[$ (id -u)! = 0]] echo $?   
9
ответ дан 3 August 2018 в 02:30

Пользователь root не должен называться «root». whoami возвращает первое имя пользователя с идентификатором пользователя 0 . $ USER содержит имя зарегистрированного пользователя, который может иметь идентификатор пользователя 0 , но имеет другое имя.

Единственная надежная программа для проверьте, зарегистрирована ли учетная запись как root, или нет:

  id -u  

Я использую -u для эффективный идентификатор пользователя, а не -r для идентификатора пользователя real . Разрешения определены эффективным [ пользователем , а не real .

Тесты

/ 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];  затем эхо «Я не корень!»  выход 1 fi  
94
ответ дан 3 August 2018 в 02:30

Другие вопросы по тегам:

Похожие вопросы: