2017-06-03 178 views
1

我在CentOS上運行Apache服務器,需要從PHP頁面運行一些bash腳本。運行不需要寫入或執行PHP文件許可的命令(例如shell_exec('ls/var/www/html/scripts /')),但是我在運行需要寫入或執行的命令時遇到問題允許。例如這個命令不執行任何操作:從PHP腳本運行bash腳本

<?php 
    $output = shell_exec('/var/www/html/scripts/test.sh'); 
    echo $output; 
?> 

我做了apache用戶擁有者和授予必要的權限scripts目錄:

drwxr-xr-x. 2 apache apache 21 Jun 3 09:54 scripts 

和test.sh文件可以看出,但沒有鎖。

-rwxr-xr-x. 1 apache apache 51 Jun 3 09:54 test.sh 

我也嘗試在PHP文件中sudo命令,並將下面的行添加到Sudoers文件的末尾,但沒有任何更改。

apache ALL=NOPASSWD: /var/www/html/scripts/test.sh 

而且我檢查PHP safe_mode設置是關閉並沒有在php.ini文件中沒有限制:

disable_functions = 

你的幫助將高度讚賞。

注:

我編輯我的bash腳本,並添加須藤象下面這樣:

#!/bin/bash 
echo "Hi from test.sh"; 
sudo touch /var/www/html/scripts/file.log; 

現在,當我運行使用此命令將文件作爲apache用戶,它成功運行:

su -s /bin/sh apache -c "/var/www/html/scripts/test.sh" 

但是通過php的網頁,它只會運行echo「Hi from test.sh」;線。當我檢查記錄,有上面運行的命令如下行:

su: pam_unix(su:session): session opened for user apache by root(uid=0) 
sudo: apache : TTY=unknown ; PWD=/var/www/html ; USER=root ; COMMAND=/bin/touch fromweb.log 
su: pam_unix(su:session): session closed for user apache 

而且從PHP網頁中運行時生成的日誌:打開和關閉:

sudo: apache : TTY=unknown ; PWD=/var/www/html/scripts ; USER=root ; COMMAND=/bin/touch fromweb.log 

缺少了pam_unix(會話SU)。

+0

您會收到任何錯誤消息? – JazZ

+0

請注意,Apache的默認用戶是'www-data'。 – JazZ

+0

@JazZ沒有特別的錯誤消息,因爲錯誤報告是關閉的,但是當我從命令提示符運行bash文件時,會發生以下錯誤: su -s/bin/sh apache -c「scripts/test.sh」 Hi .sh touch:無法觸及'file.log':權限被拒絕 –

回答

1

我發現問題所在。這是因爲Linux SELinux功能。此功能應用最低權限策略並拒絕在Linux上運行任何不必要的命令。禁用此功能後,bash腳本已成​​功運行。爲此,請編輯文件/ etc/selinux/config並將SELINUX = enforcing更改爲SELINUX = disabled並重新啓動系統。但是,不建議爲安全原因。您可以查看下面的鏈接,僅創建一些例外情況,而不是完全禁用SELinux。

https://wiki.centos.org/HowTos/SELinux

+0

太棒了!感謝您發佈您的解決方案。祝你好運。 – JazZ

+0

@JazZ感謝您的幫助 –

+0

歡迎抱歉,無法將您引導至此解決方案。 – JazZ