Я столкнулся с дилеммой при миграции установки Hadoop от Oracle Enterprise Linux к Ubuntu. Предшествующий разработчик поместил следующую команду в rc.local
в OEL:
su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"
Мне нужен вышеупомянутый веб-сервер для автоматического запуска (и остановка) в Ubuntu как указанное reporter
пользователь. (Материал автоматизации намного менее важен, чем то, чтобы заставлять этот сценарий правильно работать как reporter
пользователь, но "хорош иметь" функцию.)
Этот процесс должен запуститься в последний раз, поскольку я все еще должен настроить несколько других Hadoop-связанных сценариев для автоматического запуска перед этим (веб-сервер находится в файловой системе Hadoop, которая не становится смонтированной, пока Вы не находитесь в ОС). Каждый раз я выхожу su
команда меня просят относительно пароля. Это происходит, независимо от которого пользователь в настоящее время "активен" и не был проблемой в OEL, так как Пользователь root на самом деле используется. Вот моя текущая попытка/etc/sudoers файла, но она все еще не работает (я не уверен, корректны ли изменения, которые я внес внизу):
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
# Allow members of group sudo to execute any command after they have
# provided their password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# User privilege specification
root ALL=(ALL) ALL
user3 ALL=(ALL)NOPASSWD:/bin/su
user2 ALL=(ALL)NOPASSWD:/bin/su
user1 ALL=(ALL)NOPASSWD:/bin/su
reporter ALL=(ALL)NOPASSWD:/bin/su
Это - дубликат потока, который я отправил по UbuntuForums.org (http://ubuntuforums.org/showthread.php?p=12040341#post12040341), но я становлюсь отчаянно нуждающимся в ответе =P. Обратите внимание на то, что мое знание Linux все еще слабо (я не знал почти Linux, прежде чем этот проект был отброшен в моей полировке). Любая справка значительно ценится, поскольку это в настоящее время - главный камень преткновения!
Спасибо, - Бекас
Если вы не хотите, чтобы у вас запрашивали пароль, вы должны будете использовать su для выполнения от имени root, поэтому вам придется использовать:
sudo su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"
Однако я думаю, что вы пытаетесь Это действительно плохая идея, вы разрешаете каждому пользователю входить в систему как любой другой пользователь, включая root.
Ваши текущие редактирования к /etc/sudoers
эффективно позвольте user1
, user2
, user3
, и reporter
выполните любое действие как root
(так как выполнение su
позволяет Вам стать root
) ! Вы почти наверняка не хотите это. И это не помогает Вашей текущей проблеме вообще, потому что Вы не хотите, чтобы те пользователи выполнили что-то с альтернативными идентификационными данными, Вы хотите root
выполнять что-то с альтернативными идентификационными данными. Перед продолжением я рекомендую избавиться от тех строк от /etc/sudoers
(отредактируйте его с visudo
конечно), если Вы не абсолютно уверены, что это - то, что Вы хотите.
Если Вы не -root
пользователь и Вы выполняете это, Вас будут всегда просить относительно пароля:
su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"
Но когда root
выполнения, что, это должно просто успешно выполниться (предположение, что это работало, прежде на Oracle Сервер для предприятия и единственное соответствующее различие - это root
вход в систему отключен на Ubuntu).
Когда Вы вставляете ту строку rc.local
, в любом GNU/дистрибутиве Linux, включая Ubuntu, это выполняется как root
. Это должно просто работать. При выполнении его от командной строки это не будет работать. Но в rc.local
, это должно просто работать.
Если Вы хотите протестировать его от командной строки, дайте себе a root
оболочка вида, довольно подобного rc.local
среда:
sudo -i
(Это моделирует начальную букву root
оболочка входа в систему. Обычно, для a root
оболочка, использовать sudo -s
. И конечно, для выполнения команды ...
с sudo
, просто используйте sudo ...
.)
su -c
и sudo
возьмите другой синтаксис, поэтому если Вы действительно хотели сделать то использование команды sudo
вместо su
, необходимо было бы внести дополнительные изменения. Самый легкий путь, вероятно:
sudo -u reporter bash -c "cd /path/to/directorywithscript && ./runwebserver.sh >> /dev/null 2>&1&"
Однако я подчеркиваю, что Вы не должны преобразовывать su
команды к sudo
чтобы они работали правильно из rc.local
.
В Ubuntu, в отличие от Oracle Сервер для предприятия, входя в систему как root
отключен по умолчанию (и Вы почти наверняка не должны включать его). Но su
все еще работы, когда выполнено root
. su
также работы для не -root
пользователь, изменяющий идентификационные данные на другого не -root
пользователь.
Если у Вас есть эта строка в rc.local
и это не работает, причиной не являются проблемы sudo
по сравнению с. su
. В этом случае что-то еще идет не так, как надо. Чтобы мы диагностировали его, необходимо было бы обеспечить содержание runwebserver.sh
.
Наконец, обратите внимание на то, что bash runwebserver.sh >> /dev/null 2>&1&
довольно неэлегантно. Более просто понять (и, а тем более значительно, более хорошие взгляды) для использования bash runwebserver.sh &>> /dev/null
. Вы сказали, что это приходит последним в rc.local
, таким образом, Вы не должны использовать &
к фону это.
Однако необходимо рассмотреть, хотите ли Вы действительно подавить стандартную погрешность, а также стандартный вывод (как Вы в настоящее время делаете). По-видимому, если что-то записано в стандартную погрешность затем, это или важно или может быть подавлено путем изменения настроек многословия веб-сервера.