使用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);
?>
答
运行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”。
希望它有帮助。
只需要注意一点,你必须用'popen'来使用“mode”,像这样:'$ r = popen('/ usr/bin/at noon','r');' – Ajax 2012-11-05 08:55:26
@Ajax,good catch 。例子中的模式应该是'w'。 – jbruni 2013-01-07 22:37:40
对不起,我的坏,你是对的... – Ajax 2013-01-08 23:53:34