最近在做一個項目需要用到PHP調用Linux命令行腳本,在伺服器執行命令是可以的,但是當放在項目代碼中,在web中執行命令就不行了,調試了一天,終於可以了!
環境:centos7+nginx+mysql+php7.1
首先要解決的就是權限問題和用戶組問題:
一、查看啟動你php的進程的用戶是誰。
可以通過在命令行執行:ps -ef | grep php來看。或者在php中執行 echo exec('whoami') 來查看。centos下默認會是nobody。nobody默認沒有任何權限。
此時先自己添加一個用戶和組。
/usr/sbin/groupadd xxxx/usr/sbin/useradd -g xxxx -s /bin/bash xxxx
加完用戶後vim /etc/passwd 裡面就可以看到你添加的用戶了。
二、修改php啟動用戶為您剛添加的用戶
找到你得php安裝的地方的php-fpm.conf 。打開配置文件、編輯裡面的 user = xxxx; group = xxxx; (xxxx為您剛才添加的用戶)
重啟php-fpm(service php-fpm restart)
重複上面查看php啟動進程的用戶、應該已經變了。
三、添加剛才的用戶xxxx到sudoers裡面
visudo //修改/etc/sudoers的內容## Allow root to run any commands anywhere root ALL=(ALL) ALLxxxx ALL=(ALL) ALL //新添加這一行%xxxx ALL=(ALL) NOPASSWD: ALL //設置xxxx組下面的用戶使用sudo不需要輸入密碼
四、執行命令
到這裡已經可以正常在exec中使用sudo your command來執行命令了!!!!
當然、最好不要在生產線上環境使用哦!可以在內網機器上面實現!一切為了安全。
thinkphp3.2框架測試代碼
exec('/usr/local/bin/php test1.php 2>&1',$out,$res);
需要修改aa.py的權限和用戶組
chmod -R 777 aa.py
chown www:www aa.py
另外就是路徑問題,在框架裡要放在和入口文件一致的目錄下
五.配置開啟
exec()是php的一個禁用函數,所以我們解開
解決:
在php.ini 裡面 將disable_functions = …
裡面的 exec刪除
六.函數的使用
exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 18: …mmand [, array &output [, int &$return_var ]] );
下面來寫一個簡單的測試的demo 注意,要在linux環境下運行
七.首頁創建一個test.php
八.最後總結
這兩個函數都是執行Linux命令函數,不同的是獲取返回結果不一樣,exec只能獲取最後一行數據,shell_execu則可以獲取全部數據。使用exec函數的朋友注意了,如果你需要獲取全部返回信息,就應該使用shell_exec函數,如果命令執行結果只有一行返回信息,那哪個都行