Запуск команды cli 'at' через проблемы с разрешениями PHP - PullRequest
1 голос
/ 04 апреля 2019

I.- Предисловие

У меня есть скрипт, который при запуске выполняет следующую строку кода:

exec("echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | /usr/bin/at now +1 minute");

Он успешно планирует задачу через at команда.Я использую следующую команду, чтобы убедиться, что она работает:

[root@acool2 ~]# 
[root@acool2 ~]# atq
19  Thu Apr  4 13:17:00 2019 a nginx
[root@acool2 ~]#

Слева направо видно следующее: номер задания , дата , час , год , очередь и имя пользователя .

II.- Проблема

Когда запланированное время выполнено, команда запускается, но не работает.Следующая информация записана в / var / spool / mail / nginx:

[root@acool2 ~]# tail -f /var/spool/mail/nginx 
Received: by acool2.localdomain (Postfix, from userid 993)
    id 0E9CF30EBA39; Thu,  4 Apr 2019 13:17:01 -0700 (PDT)
Subject: Output from your job       19
To: nginx@acool2.localdomain
Message-Id: <20190404201701.0E9CF30EBA39@acool2.localdomain>
Date: Thu,  4 Apr 2019 13:17:00 -0700 (PDT)
From: nginx@acool2.localdomain (Nginx web server)

This account is currently not available

Это явно проблема с разрешениями.См. Окончательное решение .

III.- Возможное решение

Отредактируйте файл sudoers и добавьте следующее:

nginx ALL=(acool) NOPASSWD: /usr/bin/at

Затем используйте следующую команду в PHP:

exec("sudo -u acool echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | /usr/bin/at now +1 minute");

См. Окончательное решение .

IV.- Сбой

После редактирования файла sudoer и корректировки кода PHP у меня все равно нет успеха. Проблема все еще происходит.

V.- HELP

Ваша помощь и предложения будут оценены.Спасибо за ваше время.

ОБНОВЛЕНИЕ I

Некоторый прогресс в отчете.Следующее запланировало задачу для acool , но ...

exec("echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | sudo -u acool /usr/bin/at now +1 minute")

[acool@acool2 myproject]$ atq
43  Thu Apr  4 15:02:00 2019 a acool
[acool@acool2 myproject]$ 

... Проблема теперь с acool / var/ spool / mail / acool:

[acool@acool2 ~]$ tail -f /var/spool/mail/acool 
Received: by acool2.localdomain (Postfix, from userid 1001)
    id 756B830EBA39; Thu,  4 Apr 2019 14:56:00 -0700 (PDT)
Subject: Output from your job       42
To: acool@acool2.localdomain
Message-Id: <20190404215600.756B830EBA39@acool2.localdomain>
Date: Thu,  4 Apr 2019 14:56:00 -0700 (PDT)
From: acool@acool2.localdomain

This account is currently not available.

ОБНОВЛЕНИЕ II

Получил работу с предложением Barmar, добавив флаг -E к sudo и следующееизменить на файл sudoers:

nginx   ALL=(acool)     NOPASSWD: ALL

Что слишком либерально для ИМО.

ОБНОВЛЕНИЕ III - Окончательное решение!

Проблема является результатом отсутствия / отсутствия переменной среды SHELL.Нет необходимости редактировать файл sudoers или использовать sudo.Добавление export SHELL=\"/bin/bash\"; к исходной команде делает свое дело.Вот рабочее решение:

exec("export SHELL=\"/bin/bash\"; echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | /usr/bin/at now +1 minute");

Удачи!Ура:)

1 Ответ

2 голосов
/ 05 апреля 2019

Вы запускаете команду echo с sudo, и она передает обычную команду at.Вам нужно запустить команду at с sudo.

exec("echo 'cd /usr/share/nginx/myproject && /opt/rh/rh-php70/root/usr/bin/php artisan run:task mailer' | sudo -u acool /usr/bin/at now +1 minute")
...