Для основной операции — рабочих команд как корень — самое видимое различие между sudo и su - то, что sudo требует пароля вызывающего абонента (т.е. Ваш пароль), тогда как su требует пароля целевого пользователя (т.е. пароль root). Последствия безопасности были обсуждены экстенсивно в предыдущем вопросе: Который является самым безопасным способом получить права пользователя root: sudo, su или вход в систему?.
Sudo имеет дополнительные функции вне su's. В частности, после того как у Вас есть пароль пользователя, можно выполнить любую команду как тот пользователь. С другой стороны, sudo может быть настроен так, чтобы пользователь, вызывающий его, мог только выполнить определенные команды как некоторый другой пользователь. Это возможно, потому что sudo не требует никакой аутентификации (кроме, возможно, подтверждения, что Вы - Вы путем ввода пароля — но это тонко отличается от аутентификации пользователя для задачи).
Вы изменяете sudo конфигурацию путем выполнения visudo
управляйте как корень (никогда не редактируют конфигурацию непосредственно). Удостоверьтесь переменная среды EDITOR
или VISUAL
установлен на Вашего любимого редактора, или можно получить незнакомого редактора. sudoers
страница справочника является немного краткой, но имеет примеры. Позволить пользователю bob
работать /bin/foo
(с любым количеством аргументов) и /bin/bar --safe
(но не с любым другим аргументом) как root
, используйте следующие строки:
bob ALL = (root) /bin/foo
bob ALL = (root) /bin/bar --safe
GNU getopt команда использует GNU getopt () библиотечная функция, чтобы сделать парсинг аргументов и опций.
Страница справочника getopt (3) состояния:
Если getopt () не распознает символ опции, он печатает сообщение об ошибке к stderr, хранит символ в
optopt
, и возвраты?
. Программа вызова может предотвратить сообщение об ошибке путем установки opterr к 0.
Поэтому ?
используется для передачи сигналов "о неизвестной опции" и не может использоваться в качестве значения опции. (Было бы невозможно сказать опцию -?
от неизвестной опции.)
Даже если Вы могли бы распознать, что как строка опции, это будет действительно плохая идея использовать символ вопросительного знака в качестве реального аргумента, потому что большинство оболочек использует это в качестве части их синтаксиса шарика (представляющий, что символ, прежде чем это будет дополнительно использование или не в соответствии). Передача побережья ?
было бы трудным для пользователей, потому что они должны будут выйти из него.
При создании опции справки некоторого вида, обычный синтаксис должен искать короткие и долгие опции -h
и --help
.
-?
ничему не соответствовал бы и так будет передан буквально команде. Но это хрупко (сбои, если Вам действительно называли файл -a
, или под csh или zsh, настроенным для жалобы при несоответствии шарикам).
– Gilles 'SO- stop being evil'
28.06.2011, 15:37
Чтобы получить эффект использования вопросительного знака для HELP , попробуйте просто проверить, если неизвестный вариант будет воспринимать символ вопросительного знака.
Например, я хочу распечатать сообщение «Неизвестно вариант» всякий раз, когда неизвестный вариант не является вопросительным знаком. Далее я всегда называю моим использованием функции .
\?) if [ "$OPTARG" != "?" ] ; then echo "Unknown option \"$OPTARG\"" ; fi
usage
В целом я бы согласился и использую вариант H
H для получения справки и U
для использования
, но я уже использовал их для Хозяин
и пользователя
, и мне понравилось так.
. Я использую Bash на Solaris 10.
?
было реально путем проверки исходной строки. Но по-видимому GNUgetopt(1)
просто съедает-?
и возвраты 1.getopts
является менее запутанным (кроме, странно, в ATT ksh), но не выставляет индекс символа в$OPTIND
параметр th, что означает Вас, должен восстановить большую работу, если Вы получаете параметр как-a?b
. – Gilles 'SO- stop being evil' 28.06.2011, 15:36