Назад | Перейти на главную страницу

Создание папки в `/ var / run`, когда задание запускается от имени непривилегированного пользователя

у меня есть несколько upstart скрипты, которые запускаются от имени непривилегированного пользователя, используя setuid. Pid-файлы должны быть созданы в /var/run/my-service: /var/run/my-service/v1.pid, /var/run/my-service/v2.pid и так далее.

Скрипты выскочки создаются скриптом, который также создает /var/run/my-service и устанавливает разрешения, так что изначально все работает. Но эта папка исчезнет после перезагрузки, и службы не будут работать.

Я пробовал это:

pre-start script
    [ -n $PID_DIR ] && [ ! -d $PID_DIR ] && mkdir $PID_DIR
    sudo chown my-user:my-group $PID_DIR
end script

setuid my-user

Но не работает:

sudo: no tty present and no askpass program specified
my-user is not in the sudoers file.  This incident will be reported.

Я думаю это потому что setuid влияет на все процессы, даже если это после pre-start и sudo start my-service использовался.

Как я могу создать папку и установить разрешения до запуска службы?

  1. sudo не подходит ни для чего, что касается систем инициализации. пожалуйста по возможности избегайте его использования.

  2. setuid и setgid влияют на все строфы задания выскочки, включая предварительный запуск.

  3. Это можно легко обойти с помощью следующего задания my-service-prepare.conf:

    start on starting my-service
    
    task
    
    PIDDIR=/var/run/my-service
    
    exec install -o my-user -g my-group -d $PIDDIR
    

При этом вы можете использовать setuid и setgid в основном задании выскочки и не сталкиваться с какими-либо ошибками разрешений.