Как я вынуждаю пользователя стать корнем

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

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

6
22.09.2010, 13:55
4 ответа

У меня есть стандартная функция, в которой я использую bash для этой самой цели:

# Check if we're root and re-execute if we're not.
rootcheck () {
    if [ $(id -u) != "0" ]
    then
        sudo "$0" "$@"  # Modified as suggested below.
        exit $?
    fi
}

Существуют, вероятно, более изящные пути (я записал это Давным-давно!), но это хорошо работает для меня.

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

Использование: rootcheck "${@}" (rootcheck один не передаст аргументов функции rootcheck),

8
27.01.2020, 20:22
  • 1
    Возможно exec sudo "$0" "$@" чтобы избежать проблем с пробелами в аргументах и избежать имеют первое бродящее вокруг выполнение? –  Douglas Leeder 23.09.2010, 12:33
  • 2
    Да, это было бы решительным улучшением. Я обновлю ответ для отражения его. –   23.09.2010, 13:11
  • 3
    Обратите внимание, что, если это выполняется как функция как это, необходимо передать в параметрах сценария (т.е. выполнить его с rootcheck "$@"). Или можно просто поместить если встроенный блок, а не в функции. Кроме того, это должно быть сделано очень рано в сценарии как что-либо, прежде чем он будет выполнен дважды (однажды обычно, однажды как корень). –  Gordon Davisson 23.09.2010, 22:18
  • 4
    я делаю это сначала вещь в сценарии, так да. Рано является правильным. –   24.09.2010, 03:11
  • 5
    Иногда хорошо выполнить проверки работоспособности (например, рассматриваемый файл существуют?) прежде sudo'ing - я склонен делать это путем запуска сценария с чего-то как if [[ $1 == "--no-sanity-checks" ]]; then shift; else run sanity checks; fi и затем измените команду sudo к exec sudo "$0" --no-sanity-checks "$@" –  Gordon Davisson 25.09.2010, 20:28
sudo chown root yourcode
sudo chmod 500 yourcode

Вуаля!

2
27.01.2020, 20:22

Можно изменить полномочия, так, чтобы только корень мог выполнить его. Или Вы могли использовать whoami команда и в случае, если это это не корневая сила sudo.

1
27.01.2020, 20:22

Я использую эту однострочную версию, которую легко скопировать вставить поверх скриптов

[ `whoami` = root ] || { sudo "$0" "$@"; exit $?; }
5
27.01.2020, 20:22

Теги

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