Как определить, работает ли скрипт оболочки с правами root или нет? [dубликат]

Что касается сломанных пакетов, попробуйте установить тот же пакет с aptitude. он будет сдаваться менее легко и попытается найти решения, которые могут включать изменение других пакетов. Вы также можете получить список удерживаемых пакетов с dpkg --get-selections | grep hold, что может показать вам проблему.

В противном случае, возможно, попробуйте установить openjdk и jre:

Выполнение функции apt-cache search jdk или apt-cache search jre перечисляет множество пакетов, которые могут вас заинтересовать. Для установки открытых JDK и JRE вы должны использовать sudo apt-get install openjdk-7-jdk openjdk-7-jre-headless, вы можете заменить 7 на 6 или 8, если вы предпочитаете openjdk 6 или 8

EDIT: Исправлена ​​команда apt-get, спасибо @lesslazy

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

73 ответа

Пользователь 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
ответ дан 10 August 2018 в 10:08

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

3
ответ дан 10 August 2018 в 10:08
  #! / bin / bash uid = `id -u` if [" $ uid "==" 0 "] then echo 1 else echo 0 fi  
28
ответ дан 10 August 2018 в 10:08

Этот ответ - просто сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен скрипт, который запускается из графического интерфейса рабочего стола и требует прав 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
ответ дан 10 August 2018 в 10:08

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

  if (($ {EUID: -0} || "$ (id -u)"));  затем эхо Вы не root.  else echo Hello, root.  fi  

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

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

  функция amIRoot () {!  (($ {EUID: -0} || "$ (id -u)"))}  
6
ответ дан 13 August 2018 в 16:28
  #! / bin / bash uid = `id -u` if [" $ uid "==" 0 "] then echo 1 else echo 0 fi  
28
ответ дан 13 August 2018 в 16:28

Этот ответ - просто сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен скрипт, который запускается из графического интерфейса рабочего стола и требует прав 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
ответ дан 13 August 2018 в 16:28
  #! / bin / bash [[$ (id -u)! = 0]] echo $?   
9
ответ дан 13 August 2018 в 16:28

Пользователь 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
ответ дан 13 August 2018 в 16:28
  • 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 /] . Идея остается прежней. Примечание: в некоторых элементах chroot [-w / etc / shadow] не будет работать, потому что / etc / shadow не существует, поэтому подход с / . Лучше бы проверить фактическую потребность в корневых разрешениях. Если сценарий должен записываться в / etc / someconfig , просто проверьте, доступен ли этот файл для записи, или файл не существует, и / etc доступен для записи. – Lekensteyn 15 March 2011 в 02:47

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

3
ответ дан 13 August 2018 в 16:28

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

  #! / bin / bash, если [`whoami`! = '  root '] then echo «Вы должны быть root, чтобы сделать это».  exit fi ...  

Выполнение вышеуказанного будет напечатано Для этого вы должны быть root. , если текущий пользователь не является root .


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

 , если [$ USER! =  'root']  
18
ответ дан 13 August 2018 в 16:28
  • 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 !!
  • и вернуться ошибка
, если ["$ (whoami & 2> / dev / null)"! = "root"] && ["$ (id -un & 2> / dev / null)"!  = "root"] then echo "Вы должны быть root для запуска этого скрипта!"  echo "use 'sudo !!'" exit 1 fi 
1
ответ дан 13 August 2018 в 16:28

Как @Lekensteyn сказал , вы должны использовать эффективный идентификатор пользователя. Вам не нужно вызывать id -u в bash:

  #! / Bin / bash, если [[$ EUID -ne 0]];  затем эхо «Вы должны быть root, чтобы сделать это».  1 & gt; 2 выход 100 fi  

Предложение @ geirha из комментариев использует арифметическую оценку:

  #! / Bin / bash if ((EUID!  = 0));  затем эхо «Вы должны быть root, чтобы сделать это».  1 & gt; 2 выход 100 fi  
28
ответ дан 15 August 2018 в 23:12
  • 1
    В общем случае для тестирования чисел следует использовать ((..)) , а [[..]] для тестирования строк и файлов, поэтому я сделал бы если ((EUID! = 0)); тогда вместо или просто , если ((EUID)); то – geirha 13 March 2011 в 16:41
  • 2
    @geirha: Я добавил ваше предложение. – jfs 13 March 2011 в 17:11
  • 3
    EUID должен стать $ EUID . Вместо (($ EUID! = 0)) используйте [$ EUID! = 0] . Он также будет работать с тире . – Lekensteyn 13 March 2011 в 17:23
  • 4
    @Lekensteyn: EUID работает отлично. Вопрос помечен тегом bash не тире . Команда 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

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

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