2015-11-25 50 views
0

我有幾個腳本計劃在我的crontab中運行,但只能看到它們作爲根(或使用sudo)。我需要一個PHP腳本(它以nginx的形式運行)能夠將新行添加到crontab文件中。爲此,我創建了一個shell腳本(由root擁有),並通過/etc/sudoers文件將nginx用戶的權限授予sudo通過PHP Shell:無法添加新的cron作業到crontab

/etc/sudoers文件的最後一行:

nginx ALL=NOPASSWD: /etc/nginx/addcron.sh 

PHP的調用來執行腳本:

chdir("/etc/nginx/"); 
echo exec("2>&1 ./addcron.sh $custname", $output); 
echo "<pre>".print_r($output, true)."</pre>"; 

我目前的crontab:

[[email protected] nginx]$ sudo crontab -l 
* * * * * env > /tmp/env.output 
* * * * * /usr/bin/php -f /var/www/html/example/cron/cron.php 
* * * * * /usr/bin/php -f /var/www/html/demo/cron/cron.php 
0 23 * * * rm /tmp/cachegrind.out.* 

約我addcron.sh元信息文件:

[[email protected] nginx]$ pwd 
/etc/nginx 
[[email protected] nginx]$ ls -al addcron.sh 
-rwxr-xr-x 1 root root 129 Nov 24 22:16 addcron.sh 

addcron.sh內容:

#!/bin/bash 
custname="$1" 
(crontab -l; echo \"* * * * * /usr/bin/php -f /var/www/html/$custname/cron/cron.php\") | crontab - 

當我嘗試雖然運行此,我得到以下錯誤:

errors in crontab file, can't install. 
Array 
(
    [0] => "-":102: bad minute 
    [1] => errors in crontab file, can't install. 
) 

現在看來似乎不喜歡在-馬克addcron.sh,但我的Google搜索建議這是正確的。另外,我還嘗試添加sudo到PHP的exec命令,但我只是得到了以下錯誤:

sorry, you must have a tty to run sudo 

我在做什麼錯誤或丟失,爲什麼?

回答

1

注意:從安全角度來看,在root的帳戶下運行與系統管理員無關的cron作業是不良想法。在nginx用戶下安裝您的cron。

的問題是由您的bash腳本引號的逃逸引起的(你可以直接在bash一塊檢查,片,順便說一句):

> (crontab -l; echo \"* * * * * /usr/bin/php -f /var/www/html/$custname/cron/cron.php\") 
no crontab for username 
"* ... <all kinds of filenames in here> ... /usr/bin/php -f /var/www/html/the_customer/cron/cron.php" 

沒有報價逃避工作的事情會好一點:

> (crontab -l; echo "* * * * * /usr/bin/php -f /var/www/html/$custname/cron/cron.php") 
no crontab for username 
* * * * * /usr/bin/php -f /var/www/html/the_customer/cron/cron.php 

您可能要增加一些保護,防止重複條目,這裏的crontab的樣子幾個調用後:

> crontab -l 
# DO NOT EDIT THIS FILE - edit the master and reinstall. 
# (- installed on Tue Nov 24 20:54:10 2015) 
# (Cronie version 4.2) 
# DO NOT EDIT THIS FILE - edit the master and reinstall. 
# (- installed on Tue Nov 24 20:54:09 2015) 
# (Cronie version 4.2) 
# DO NOT EDIT THIS FILE - edit the master and reinstall. 
# (- installed on Tue Nov 24 20:54:09 2015) 
# (Cronie version 4.2) 
# DO NOT EDIT THIS FILE - edit the master and reinstall. 
# (- installed on Tue Nov 24 20:54:08 2015) 
# (Cronie version 4.2) 
# DO NOT EDIT THIS FILE - edit the master and reinstall. 
# (- installed on Tue Nov 24 20:54:07 2015) 
# (Cronie version 4.2) 
* * * * * /usr/bin/php -f /var/www/html/the_customer/cron/cron.php 
* * * * * /usr/bin/php -f /var/www/html/the_customer/cron/cron.php 
* * * * * /usr/bin/php -f /var/www/html/the_customer/cron/cron.php 
* * * * * /usr/bin/php -f /var/www/html/the_customer/cron/cron.php 
* * * * * /usr/bin/php -f /var/www/html/the_customer/cron/cron.php 
+0

謝謝,我會考慮收緊安全。刪除引號排除了錯誤信息,但'crontab -e'仍然有相同的內容,這很奇怪;我希望有一個錯誤或內容被添加,但都沒有發生。 – Bing

+0

您是否正在檢查正確用戶的crontab(如果在sudo下執行,調用腳本或'root')? –

+0

調用腳本的一個是'nginx',當我嘗試給他們''su'或者像他們一樣運行命令時('runuser -l nginx -c'crontab -l''),我得到消息'This Account is currently不可用.'我試圖在'root'下運行它,這就是爲什麼我把'nginx ALL = NOPASSWD:/ etc/nginx/addcron.sh'加到'/ etc/sudoers'中的原因,但'sudo crontab -l'不顯示新條目,這就是爲什麼我很困惑,因爲沒有錯誤信息。 – Bing

0

我最近發佈了一個項目,該項目允許PHP獲取並與真正的Bash shell進行交互。在這裏獲得:https://github.com/merlinthemagic/MTS

下載您只需使用下面的代碼後:

$custname= "someone"; 
$strCmd = "echo \"* * * * * /usr/bin/php -f /var/www/html/".$custname."\" >> /cron/cron.php"; 

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 
$return1 = $shell->exeCmd($strCmd); 
//assuming your distribution reloads/restarts using 'service' 
$return2 = $shell->exeCmd('service crond restart'); 

這將你的行追加到cron文件。