运行 cli 'at' 命令通过 PHP 权限问题

Running cli 'at' command via PHP permissions issues

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.- 帮助

我们将不胜感激您的帮助和建议。感谢您的宝贵时间。

更新我

要报告一些进展。以下为 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.

更新二

使用 Barmar 建议,将 -E 标志添加到 sudo 并对 sudoers 文件进行以下更改:

nginx   ALL=(acool)     NOPASSWD: ALL

IMO 太自由了。

更新 III - 最终解决方案!

问题SHELL 环境变量为 absent/missing 的结果。根本不需要编辑 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");

祝你好运!干杯:)

您正在 运行 将 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")