Вот выборка из http://www.debian-administration.org/articles/28, который, кажется, отвечает на Ваш вопрос.
Примечание: В сценарии в качестве примера ниже просто добавляют вызов к"start)
"разделите для фактического запуска программы. Можно протестировать функциональность сценария, не перезагружая систему: назовите его с полным путем и предоставлением его параметр"start
"или"stop
"
Здесь идет:
Debian использует Sys-V как init система для выполнения команд когда система runlevel изменения - например, во времени завершения работы и начальной загрузке.
Если Вы хотите добавить новый сервис для запуска, когда начальные загрузки машины необходимо добавить необходимый сценарий к каталогу /etc/init.d/
. Многие сценарии, уже существующие в том каталоге, дадут Вам пример вида вещей, которые можно сделать.
Вот очень простой сценарий, который разделен на две части, код, который всегда работает, и код, который работает при вызове с "запуском" или "остановкой".
#! /bin/sh
# /etc/init.d/blah
#
# Some things that run always
touch /var/lock/blah
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting script blah "
echo "Could do more here"
;;
stop)
echo "Stopping script blah"
echo "Could do more here"
;;
*)
echo "Usage: /etc/init.d/blah {start|stop}"
exit 1
;;
esac
exit 0
После того как Вы сохранили свой файл в корректное местоположение, удостоверяются, что это - исполняемый файл путем выполнения"chmod 755 /etc/init.d/blah
".
Затем необходимо добавить соответствующие символьные ссылки, чтобы заставить сценарий выполняться, когда система понижается или подходит.
Самый простой способ сделать это состоит в том, чтобы использовать Debian-определенную команду update-rc.d
:
root@skx:~# update-rc.d blah defaults
Adding system startup for /etc/init.d/blah ...
/etc/rc0.d/K20blah -> ../init.d/blah
/etc/rc1.d/K20blah -> ../init.d/blah
/etc/rc6.d/K20blah -> ../init.d/blah
/etc/rc2.d/S20blah -> ../init.d/blah
/etc/rc3.d/S20blah -> ../init.d/blah
/etc/rc4.d/S20blah -> ../init.d/blah
/etc/rc5.d/S20blah -> ../init.d/blah
После тестирования первого ответа и все еще получения sudo: sorry, you are not allowed to preserve the environment
, Я решил навести справки о лучшем решении.
После небольшого количества тестирования я нашел, что опция, которая вопросы setenv
.
Defaults!/bin/build.sh setenv
Для создания этого немного более безопасным мы можем добавить пару настроек:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11/bin"
Defaults!/bin/build.sh setenv,env_reset,env_delete+=PATH,env_delete+=LD_PRELOAD,env_delete+=LD_LIBRARY_PATH,env_delete+=SSH_AUTH_SOCK,env_delete+=PYTHONPATH,env_delete+=PERL5LIB
%deploy ALL=(ALL) NOPASSWD: /bin/build.sh *
Если Вы хотите позволить пользователям войти deploy
группа для выполнения любой команды почти с любой переменной среды:
Defaults:%deploy !env_reset,env_delete-=PYTHONPATH,env_delete-=PERL5LIB
%deploy ALL = (ALL) ALL
Выполненный sudo -V
видеть, какие переменные удалены.
Существует мало точки в ограничении команды, если Вы позволяете пользователю сохранять все переменные среды, как это, вероятно, позволит пользователю выполнять произвольный код через некоторую переменную.
Если Вы тщательно рассмотрели свой сценарий, и Вы уверены, что у Вас есть исчерпывающий список переменных среды, которые должны быть удалены, можно указать, что эти переменные среды должны быть удалены, и все другие должны быть сохранены.
Defaults!/bin/build.sh !env_reset,env_delete+=DANGEROUS_VAR
%deploy ALL = (ALL) /bin/build.sh
sudo
реализация обеспечивает его, я всегда предпочитал бы определять белый список с помощью env_keep
опция. И этот список не должен определенно включать что-то как PATH
, LD_PRELOAD
или PERL5LIB
.
– Dubu
02.10.2013, 11:51
PATH
, LD_PRELOAD
, безотносительно) пройти не дыра в системе безопасности, если Вы позволяете какой-либо команде быть выполненной: это - только дыра в системе безопасности, если Вы хотите ограничить команду, потому что много переменных позволяет работать вокруг ограничения команды.
– Gilles 'SO- stop being evil'
02.10.2013, 13:04
RUN Sudo Visudo
и прокомментируйте две строки, показанные ниже. Комментируя только env_reset
не работает
#Defaults env_reset
Defaults mail_badpass
#Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"