Запуск сценария оболочки при запуске экземпляра - PullRequest
1 голос
/ 31 марта 2012

Я пытаюсь запустить скрипт bash при запуске моих экземпляров EC2. Все, что я хочу сделать, это запустить GlassFish при запуске сервера. Команда, которую я пытаюсь выполнить:

sudo /glassfish3/bin/asadmin start-domain

Что работает, когда я ввожу его вручную.

Я попытался добавить эту команду в нескольких местах без удачи:

  • в конце /etc/rc.local
  • в конце /etc/rc.d/rc.local
  • создал свой собственный скрипт в /etc/init.d/

Я дал каждому сценарию 777 разрешений.

У кого-нибудь есть идеи, что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

Если не сконфигурировано странно, sudo хочет аутентификацию при запуске. Обычно он предназначен для интерактивного запуска.

Предполагая, что скрипт / glassfish3 / bin / asadmin принадлежит root, , вы можете установить его права доступа к файлу 6755. Это делает то, что вы, вероятно, имели в виду sudo, чтобы сделать , Конечно, это также может быть опасно и может представлять угрозу безопасности.

(кстати, @ jcomeau_ictx прав. Вы должны проверять журналы, как он предлагает.)

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

Один может изменить права доступа к файлу для любого исполняемого файла на 6755, но это не всегда хорошая практика. Результатом таких разрешений является (а) позволить любому запускать исполняемый файл с (б) полными привилегиями владельца исполняемого файла. Иногда это именно то, что вы хотите, но смотрите: в случае OP, /glassfish3/bin/asadmin с такими разрешениями теперь может вызываться любым, с любыми аргументами, с полными привилегиями root. Если это не то, чего вы хотите, тогда вам необходимо принять дополнительные меры.

Возможны несколько способов получения дополнительной помощи. Один из них выглядит следующим образом.

  1. Оставьте исполняемый файл с правами доступа к файлу 755.
  2. Напишите и скомпилируйте небольшую оболочку, программу, которая использует execv() из unistd.h для запуска исполняемого файла.
  3. Если это практически возможно, не позволяйте оболочке принимать аргументы; в противном случае пусть его аргументы будут настолько жесткими и жесткими, насколько это возможно. Пусть оболочка строго контролирует аргументы, передаваемые исполняемому файлу.
  4. Пусть обертка принадлежит root, , но используйте chown, чтобы назначить ей подходящую группу, в состав которой не входят пользователи. Вы можете предпочесть создать новую группу для этой цели, но если вы сканируете файл /etc/group в своей системе, вы вряд ли найдете уже существующую подходящую группу. Для справки, вы можете перечислить команды, уже принадлежащие к группам специального назначения в вашей системе, с помощью ls -l /bin /usr/bin | grep -vE '^([^[:space:]]+[[:space:]]+){2}(root[[:space:]]+){2}' или подобного.
  5. Дайте файлу обертки права доступа 6754, что делает его неисполнимым, кроме рассматриваемой группы.
  6. Допустить вызывающий сценарий к группе и дать разрешения файлу вызывающего сценария 2755.

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

Возможно несколько вариантов техники, и маловероятно, что вы будете использовать в точности ту, которая указана выше, но если вы прочитаете man-страницу и / или информационную запись в команде chown и узнаете подробности о правах доступа к файлу, и если вы немного поэкспериментируете, вы сможете разработать решение, которое будет работать для вас, не создавая угрозы безопасности.

1 голос
/ 31 марта 2012

Скорее всего, это проблема JAVA_HOME, попробуйте использовать sudo -i, вот мой рабочий скрипт инициализации:

#!/bin/bash
# description: Glassfish Start Stop Restart
# processname: glassfish
# chkconfig: - 95 80

DOMAIN=domain555

GF_HOME=/opt/glassfish3
DOMAIN_DIR=/home/glassfish/domains
RUN_AS=glassfish

CMD_START="$GF_HOME/bin/asadmin start-domain --domaindir $DOMAIN_DIR"
CMD_STOP="$GF_HOME/bin/asadmin stop-domain --domaindir $DOMAIN_DIR"

function start() {
    sudo -u $RUN_AS -i $CMD_START $DOMAIN
}

function stop() {
    sudo -u $RUN_AS -i $CMD_STOP $DOMAIN
}

case $1 in
start)
    start;
;;
stop)
    stop;
;;
restart)
    stop;
    start;
;;
esac
exit 0

JAVA_HOME и PATH должны быть установлены в .bashrc или .bash_profile

пользователя
...