2011-04-01 151 views
2

我需要使用PHP運行unix at命令。如何做到這一點? curl不是我正在做的選項。如果我試圖運行它只是exec('at')它沒有迴應。但是,如果我使用ssh運行它,它工作正常。所以我想這是權限/路徑問題。使用exec()運行unix`at`命令

回答

3

我想你有一些真正的at命令行,因爲只有at是無效的語法。你的命令應該包含一些參數。

但是,也許你的問題是at不在$PATH。嘗試使用通常爲/usr/bin/at的完整路徑運行。用whereis at檢查。

3

記住「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

1

運行cat /etc/passwd檢查whitch外殼也使用apache用戶,如果是bin/false可以「在」從apache用戶運行。

我發現了針對此問題的技巧通過運行shell命令,這樣的事情之前,出口超過斌/ bash shell中:

出口SHELL = /斌/慶典;回聲「shell命令」| at:time::date:

並將它作爲php exec()函數的參數傳遞。

通過這種方式,您將能夠從apache運行'at'調度。

1

原因是在文件「/etc/at.deny」中。掃描該文件,您將看到一行「www-data」,這是apache2正在運行的用戶(本例中文件的最後一行)。這會拒絕用戶「www-data」運行「at」命令。只需從/etc/at.deny刪除該行。然後你可以使用「shell_exec」運行「at」。

希望它有幫助。