Что проще всего в сценарии оболочки, чтобы гарантировать, что он не запускается от имени пользователя root?

Это очень неформальный ответ на заданный вопрос.

Можно ли записать 3233 как произведение двух других чисел, больших 1? Есть ли способ пройти путь вокруг всех семи мостов Кенигсберга , не взяв ни одного моста дважды? Это примеры вопросов, которые имеют общую черту. Может быть неясно, как эффективно определить ответ, но если ответ «да», то есть короткое и быстрое подтверждение проверки. В первом случае нетривиальная факторизация 51; во втором - маршрут для ходьбы по мостам (установка ограничений).

Задача решения представляет собой набор вопросов с ответами «да» или «нет», которые различаются только одним параметром. Скажем, проблема COMPOSITE = {«Является n композитным»: n является целым числом} или EULERPATH = {«Имеет ли граф G путь Эйлера?»: G - конечный граф}.

Теперь некоторые проблемы решения поддаются эффективным, если не очевидным алгоритмам. Более 250 лет назад Эйлер открыл эффективный алгоритм для таких проблем, как «Семь мостов Кенигсберга».

С другой стороны, для многих проблем решения неясно, как получить ответ, но если вы знаете какую-то дополнительную информацию, очевидно, как доказать, что у вас есть ответ правильно. COMPOSITE выглядит так: Пробное деление - это очевидный алгоритм, и он медленный: чтобы умножить 10-значное число, вам нужно попробовать что-то вроде 100 000 возможных делителей. Но если, например, кто-то сказал вам, что 61 является делителем 3233, простое длинное деление - эффективный способ убедиться, что они верны.

Класс сложности NP - это класс проблем решения, где ответы «да» имеют короткий характер, быстро проверяют доказательства. Как COMPOSITE. Важным моментом является то, что в этом определении ничего не говорится о том, насколько сложна проблема. Если у вас есть правильный и эффективный способ решения проблемы решения, просто записывать шаги в решении достаточно убедительно.

Продолжается исследование алгоритмов, и все новые умные алгоритмы создаются постоянно. Проблема, которую вы, возможно, не знаете, как эффективно решить сегодня, может оказаться эффективным (если не очевидным) решением завтра. Фактически, исследователи до 2002 нашли эффективное решение для COMPOSITE! Со всеми этими достижениями, действительно нужно задаться вопросом: неужели это немного о том, чтобы иметь короткие доказательства просто иллюзию? Может быть, каждая проблема решения , которая поддается эффективным доказательствам, имеет эффективное решение? Никто не знает .

Возможно, самым большим вкладом в эту область стало открытие уникального класса проблем NP. Играя вокруг схемных моделей для расчета, Стивен Кук нашел решение проблемы разнообразия NP, которое было доказуемо труднее или труднее, чем каждой другой проблемы NP. Для эффективного решения любой другой проблемы в NP можно было бы эффективно решить задачу boolean problemability . Вскоре после этого Ричард Карп показал, что ряд других проблем решения может служить той же цели. Эти проблемы, в некотором смысле, «самые трудные» проблемы в NP, стали известны как NP-полные проблемы.

Конечно, NP - это только класс проблем решения. Многие проблемы естественно не сформулированы таким образом: «найти факторы N», «найти кратчайший путь в графе G, который посещает каждую вершину», «дать набор переменных, которые делают следующее логическое выражение истинным». Хотя можно неофициально говорить о некоторых таких проблемах как «в NP», технически это не имеет большого смысла - они не являются проблемами решения. Некоторые из этих проблем могут даже иметь такую ​​же мощность, как NP-полная проблема: эффективное решение этих проблем (без решения) приведет непосредственно к эффективному решению любой проблемы NP. Подобная проблема называется NP-hard.

10
задан Jherico 28 June 2010 в 19:46
поделиться

3 ответа

Пример в bash:

if [ `id -u` = 0 ]; then
  echo "You are root, go away!"
  exit 1
fi
13
ответ дан 3 December 2019 в 22:34
поделиться

Я использую что-то подобное в начале скриптов, которые я хочу запускаться под учетной записью службы:

LUSER='my-service'
if [ `id -un` != $LUSER ]; then
    exec su  $LUSER -s $SHELL -c "$0 $@"
fi

# actual script commands here.

Если запускаться от имени правильного пользователя, выполнение будет продолжаться в соответствии с планом. Если запустить как root привилегии отбрасываются желаемому идентификатору пользователя. Другие пользователи получит запрос пароля, который должен сообщить им, что что-то неправильный.

su -s $ SHELL ... используется для переопределения оболочки, установленной в / etc / passwrd - для учетной записи службы может быть установлено значение / bin / false .

Я использовал это в системах Debian, используя bash и dash . Не стесняйтесь прокомментировать, можно ли улучшить переносимость.

1
ответ дан 3 December 2019 в 22:34
поделиться

В BASH вы можете взять вывод whoami и сравнить его с root.

1
ответ дан 3 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

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