apt-get install sudo -y
- Используется для установки пакета sudo в системах на базе Debian
и y используется для указания да во время установки. yum install -y sudo
- используется для установки пакета sudo в системах на базе Fedora, а y используется для указания да во время установки. echo "stack ALL = (ALL_ NOPASSWD: ALL" >> / etc / sudoers
-
Объединение строки stack ALL = (ALL_ NOPASSWD: ALL
до конца
/ etc / sudoers
файл. По сути, вы устанавливаете пакет sudo
для Debian
или fedora
] и предоставив пользователю стек
право запускать команды с sudo
, добавив эту строку в файл / etc / sudoers
.
Простой ответ :a ==
является логическим оператором только внутри [[ … ]]
конструкций.
$ [[ one == one ]] && echo "yes"
yes
И это работает также в ksh и bash.
При использовании вне [[ … ]]
конструкции =cmd становится оператором расширения имени файла , но только в zsh
$ echo ==
zsh: = not found
Именно это происходит внутри более простой [ … ]
конструкции, которую вы использовали.
Но правильный способ проверить, что пользователь, выполняющий сценарий оболочки, является пользователем root, это сделать:
if (( EUID == 0 )); then
echo "root"
else
echo "not root"
fi
=cmd
— это оператор расширения имени файла в zsh
, который расширяется до пути cmd
(, разрешенного поиском$PATH
). Если такая команда не найдена, это приводит к фатальной ошибке, например, когда глобусы не совпадают.
Итак, ==
здесь, в аргументе этой команды [
, просит оболочку найти команду =
в $PATH
, а zsh
говорит вам, что такой =
нигде нет.
$ echo =ls
/bin/ls
$ echo ==
zsh: = not found
$ install -m 755 /dev/null ~/bin/=
$ echo ==
/home/stephane/bin/=
Здесь либо используйте стандартный синтаксис для команды [
:
[ "$_user" = root ]
Или процитируйте=
:
[ "$_user" '==' root ]
Вам также понадобятся кавычки для сопоставления регулярных выражений:
[ "$_user" '=~' '^ro+t$' ]
В любом случае вы захотите процитировать $_user
, иначе вы получите какую-нибудь запутанную ошибку, когда $_user
пусто или не задано (и, что еще хуже, включая уязвимость ввода произвольной команды в Korn -, например оболочки. кромеzsh
(напримерbash
)).
Вы также можете отключить эту функцию, отключив параметр equals
(set +o equals
), который не очень полезен в сценариях.
Или используйте конструкциюksh
-стиля [[...]]
:
[[ $_user = root ]]
[[ $_user == root ]]
[[ $_user =~ '^ro+t$' ]]
Или case
конструкция:
case $_user in
(root)...
esac
([[ = ]]
, [[ == ]]
и case
выполняют сопоставление с шаблоном (подстановочный знак, а не регулярное выражение))
Обратите внимание, что это условное выражение, нет необходимости устранять неоднозначность между оператором присваивания и оператором равенства, поэтому нет необходимости в операторе ==
.
Более короткий ответ по касательной.. возможно вы читали образец, созданный для работы под другим типом оболочки?
$ zsh -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
zsh:1: = not found
$ bash -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
equal!