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

问题描述 投票:1回答:1

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: [email protected]
Message-Id: <[email protected]>
Date: Thu,  4 Apr 2019 13:17:00 -0700 (PDT)
From: [email protected] (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: [email protected]
Message-Id: <[email protected]>
Date: Thu,  4 Apr 2019 14:56:00 -0700 (PDT)
From: [email protected]

This account is currently not available.

更新II

得到它与Barmar建议一起使用,将-E标志添加到sudo并将以下更改添加到sudoers文件:

nginx   ALL=(acool)     NOPASSWD: ALL

这是过于自由的IMO。

更新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");

祝好运!干杯:)

php nginx laravel-4 centos7 at-command
1个回答
2
投票

你正在用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")
© www.soinside.com 2019 - 2024. All rights reserved.