使用exec()运行unix`at`命令

问题描述:

我需要使用PHP运行unix at命令。如何做到这一点? curl不是我正在做的选项。如果我试图运行它只是exec('at')它没有回应。但是,如果我使用ssh运行它,它工作正常。所以我想这是权限/路径问题。使用exec()运行unix`at`命令

我想你有一些真正的at命令行,因为只有at是无效的语法。你的命令应该包含一些参数。

但是,也许你的问题是at不在$PATH。尝试使用通常为/usr/bin/at的完整路径运行。用whereis at检查。

记住“at”从标准输入接收它的脚本,所以你需要使用popen()打开一条到at命令的管道。将您的命令写入该管道并关闭它。在打开管道时,您希望“at”运行该命令的时间应该是命令行的一部分。

<?php 
$r = popen('/usr/bin/at noon'); 
fwrite($r,"ls -l"); 
pclose($r); 
?> 
+0

只需要注意一点,你必须用'popen'来使用“mode”,像这样:'$ r = popen('/ usr/bin/at noon','r');' – Ajax 2012-11-05 08:55:26

+0

@Ajax,good catch 。例子中的模式应该是'w'。 – jbruni 2013-01-07 22:37:40

+0

对不起,我的坏,你是对的... – Ajax 2013-01-08 23:53:34

运行cat /etc/passwd检查whitch外壳也使用apache用户,如果是bin/false可以“在”从apache用户运行。

我发现了针对此问题的技巧通过运行shell命令,这样的事情之前,出口超过斌/ bash shell中:

出口SHELL = /斌/庆典;回声“shell命令”| at:time::date:

并将它作为php exec()函数的参数传递。

通过这种方式,您将能够从apache运行'at'调度。

原因是在文件“/etc/at.deny”中。扫描该文件,您将看到一行“www-data”,这是apache2正在运行的用户(本例中文件的最后一行)。这会拒绝用户“www-data”运行“at”命令。只需从/etc/at.deny删除该行。然后你可以使用“shell_exec”运行“at”。

希望它有帮助。