Цитата из справочной страницы bash, раздел Command Substitution:
Встроенные строки новой строки не удаляются, но они могут быть удалены при разбиении слова.Немного дальше, тот же раздел:
Встроенные символы новой строки не удаляются, но они могут быть удалены при разбиении слова.
Если замещение появляется в двойных кавычках, разбиение слов и расширение имени пути не выполняются по результатам.
#! / bin / bash, если [[$ EUID -ne 0]]; затем echo «Этот скрипт должен быть запущен как root» exit 1 fi
#! / bin / bash, если [[$ EUID -ne 0]]; затем echo «Этот скрипт должен быть запущен как root» exit 1 fi
#! / bin / bash, если [[$ EUID -ne 0]]; затем echo «Этот скрипт должен быть запущен как root» exit 1 fi
#! / bin / bash, если [[$ EUID -ne 0]]; затем echo «Этот скрипт должен быть запущен как root» exit 1 fi
#! / bin / bash, если [[$ EUID -ne 0]]; затем echo «Этот скрипт должен быть запущен как root» exit 1 fi
$ UID
и $ EUID
- это базисы. У простых оболочек, совместимых с POSIX, нет этих переменных, и вам нужно использовать id (1) .
– David Foerster
16 October 2014 в 14:28
, если ((EUID)); затем
, см. комментарий @ geirha
– jfs
18 October 2014 в 00:38
sudo
. Если вы запустите sudo sh -c 'echo $ EUID'
, вы увидите ожидаемые результаты.
– M. Dudley
19 November 2015 в 22:09
$ EUID
- это башизм (как упоминалось выше @DavidFoerster), а ваш / bin / sh
скорее всего, является ссылкой на / bin / dash
, а не / bin / bash
. sudo bash -c 'echo $ EUID'
даст ожидаемый результат.
– Adrian Günter
10 May 2017 в 00:40
Пользователь root не должен называться «root». whoami возвращает первое имя пользователя с идентификатором пользователя 0. $USER содержит имя зарегистрированного пользователя, который может иметь идентификатор пользователя 0, но имеет другое имя.
Единственная надежная программа для проверки, зарегистрирована ли учетная запись как root, или not:
id -u
Я использую -u для эффективного идентификатора пользователя, а не -r для реального идентификатора пользователя.
/etc/passwd содержат следующие имена пользователей с идентификатором пользователя 0 в указанном порядке: [!d9 ]
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
Как сказал @Lekensteyn, вы должны использовать эффективный идентификатор пользователя. Вам не нужно называть id -u в bash:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "You must be root to do this." 1>&2
exit 100
fi
. Предложение @ geirha из комментариев использует арифметическую оценку:
#!/bin/bash
if (( EUID != 0 )); then
echo "You must be root to do this." 1>&2
exit 100
fi
Вы можете выполнить это, используя команду 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' ]
Принимая во внимание эффективность, вы можете сначала проверить переменную среды 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)"))
}
Один простой способ заставить скрипт запускать только root: запустить скрипт с помощью строки: #!/bin/su root
Этот фрагмент будет:
Проверять разные сеансы, предлагая использовать 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Этот ответ заключается только в том, чтобы сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен сценарий, который запускается из графического интерфейса рабочего стола и требует прав 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.
Один простой способ заставить скрипт запускать только root: запустить скрипт с помощью строки: #!/bin/su root
Этот ответ заключается только в том, чтобы сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен сценарий, который запускается из графического интерфейса рабочего стола и требует прав 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.
Пользователь 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
Принимая во внимание эффективность, вы можете сначала проверить переменную среды 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)"))
}
Вы можете выполнить это, используя команду 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' ]
Этот фрагмент будет:
Проверять разные сеансы, предлагая использовать 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Один простой способ заставить скрипт запускать только root: запустить скрипт с помощью строки: #!/bin/su root
Этот ответ заключается только в том, чтобы сохранить идею, которая может быть полезна для некоторых из вас. Если вам нужен сценарий, который запускается из графического интерфейса рабочего стола и требует прав 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.