Вопрос Без пароля в сценарии Bash?


Я столкнулся с дилеммой при переносе установки 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 до того, как этот проект был сброшен у меня на коленях). Любая помощь значительно оценили, поскольку это в настоящее время является крупным камнем преткновения!

Благодаря, -Бекас


1
2018-06-20 00:13


происхождения




ответы:


Ваши текущие изменения /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 Enterprise Server, и единственное релевантное различие заключается в том, что root логин отключен на Ubuntu).

Когда вы помещаете эту строку в rc.local, в любом дистрибутиве GNU / Linux, включая Ubuntu, он запускается как root, Он должен просто работать. Когда вы запустите его из командной строки, это не сработает. Но в rc.local, он должен просто работать.

Если вы хотите проверить его из командной строки, дайте себе root оболочка такого рода очень похожа на rc.localсреда:

sudo -i

(Это моделирует начальную root login shell. Обычно для 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 Enterprise Server, вход в систему как 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, поэтому вам не нужно использовать & для его фона.

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


2
2018-06-20 00:40



Похоже, файл sudoers, который я создал, работает так, как было упомянуто в моей исходной статье UbuntuForums.org. Следующий код успешно изменяет пользователей без подсказки пароля: [CODE] sudo su reporter [/ CODE] Мне интересно, можно ли просто набрать «su reporter», избегая при этом пароля? - Sniperm4n
Вау, спасибо за безумный подробный ответ Элиа! Я полностью прочитаю это и отреагирую соответствующим образом утром, поскольку мне нужно сейчас оставить работу = /. - Sniperm4n
@ Sniperm4n reporter линии в sudoers не потому, что он работает, и его нужно удалить. предположительно reporter является преднамеренно ограниченным,root пользователь, который запускает ваш веб-сервер с умышленно уменьшенными разрешениями. Предполагая, что это так, reporter должен определенно не сможет работать /bin/su в виде root (как вы в настоящее время настроили sudoers). Кроме того, любой администратор вашей системы уже может использовать sudo для запуска этой или любой другой команды в качестве root; вероятно, нет веских оснований для вашего user1, user2, а также user3 записи. - Eliah Kagan
Спасибо всем за ваши подробные ответы! К сожалению, проект был прекращен (с финишной чертой в поле зрения), и я не могу проверить это дальше. Yay для корпоративных B.S.! знак равно - Sniperm4n


Если вы не хотите, чтобы вас попросили ввести пароль, вам придется использовать для выполнения su как root, поэтому вам придется использовать:

sudo su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

Тем не менее, я думаю, что вы пытаетесь сделать, это очень плохая идея, вы разрешаете каждому пользователю войти в систему, как и все остальные, включая root.


0
2018-06-20 00:42



Эта строка находится в rc.local и работает как root уже, поэтому нет необходимости (и не делает ничего иначе) sudoперед ним там. Для тестирования команды это имеет смысл, хотя это не идеально, потому что он проверяет команду с текущим не-root пользовательская среда. (Видеть мой ответ для деталей.) Вы совершенно правы, что нынешний sudoers конфигурация, похоже, позволяет каждому пользователю стать root, и что это плохо. Как минимум reporter по-видимому, не является администратором и преднамеренно. - Eliah Kagan
Все пользователи в системе - администраторы на самом деле lol. Дело в том, что мы гораздо меньше обеспокоены безопасностью из-за того, что это предпроизводственный кластер. Я перечитаю и задумаюсь над своим первым ответом завтра утром! знак равно - Sniperm4n