Как указать-? опция с GNU getopt

Для основной операции — рабочих команд как корень — самое видимое различие между 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

6
24.01.2012, 14:16
3 ответа

GNU getopt команда использует GNU getopt () библиотечная функция, чтобы сделать парсинг аргументов и опций.

Страница справочника getopt (3) состояния:

Если getopt () не распознает символ опции, он печатает сообщение об ошибке к stderr, хранит символ в optopt, и возвраты ?. Программа вызова может предотвратить сообщение об ошибке путем установки opterr к 0.

Поэтому ? используется для передачи сигналов "о неизвестной опции" и не может использоваться в качестве значения опции. (Было бы невозможно сказать опцию -? от неизвестной опции.)

4
27.01.2020, 20:27
  • 1
    На уровне C можно узнать если ? было реально путем проверки исходной строки. Но по-видимому GNU getopt(1) просто съедает -? и возвраты 1. getopts является менее запутанным (кроме, странно, в ATT ksh), но не выставляет индекс символа в $OPTINDпараметр th, что означает Вас, должен восстановить большую работу, если Вы получаете параметр как -a?b. –  Gilles 'SO- stop being evil' 28.06.2011, 15:36

Даже если Вы могли бы распознать, что как строка опции, это будет действительно плохая идея использовать символ вопросительного знака в качестве реального аргумента, потому что большинство оболочек использует это в качестве части их синтаксиса шарика (представляющий, что символ, прежде чем это будет дополнительно использование или не в соответствии). Передача побережья ? было бы трудным для пользователей, потому что они должны будут выйти из него.

При создании опции справки некоторого вида, обычный синтаксис должен искать короткие и долгие опции -h и --help.

2
27.01.2020, 20:27
  • 1
    При использовании GNU getopt необходимо поддерживать --help. –  cjm 28.06.2011, 13:36
  • 2
    На самом деле, большую часть времени, -? ничему не соответствовал бы и так будет передан буквально команде. Но это хрупко (сбои, если Вам действительно называли файл -a, или под csh или zsh, настроенным для жалобы при несоответствии шарикам). –  Gilles 'SO- stop being evil' 28.06.2011, 15:37
  • 3
    @cjm: да. Я уже делаю. –  mschonaker 28.06.2011, 19:54

Чтобы получить эффект использования вопросительного знака для HELP , попробуйте просто проверить, если неизвестный вариант будет воспринимать символ вопросительного знака.

Например, я хочу распечатать сообщение «Неизвестно вариант» всякий раз, когда неизвестный вариант не является вопросительным знаком. Далее я всегда называю моим использованием функции .

\?) if [ "$OPTARG" != "?" ] ; then echo "Unknown option \"$OPTARG\"" ; fi
        usage

В целом я бы согласился и использую вариант H H для получения справки и U для использования , но я уже использовал их для Хозяин и пользователя , и мне понравилось так.

. Я использую Bash на Solaris 10.

1
27.01.2020, 20:27

Теги

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