環(huán)境說(shuō)明
手頭有一臺(tái)linux的測(cè)試服務(wù)器付翁,最近因?yàn)闃I(yè)務(wù)需要魂那,需要通過php訪問另一臺(tái)服務(wù)器去執(zhí)行某些命令祈匙。
由于另一臺(tái)服務(wù)器已經(jīng)對(duì)這臺(tái)服務(wù)器開了私鑰澡为,所以在終端上是可以直接執(zhí)行命令而不需要輸入密碼的。
問題
PHP無(wú)法使用exec命令摸屠,沒有任何返回值谓罗。
解決途徑
1.php.ini的配置有問題。
由于php是7.0以上的版本季二,取消了安全模式檩咱,所以考慮PHP.ini文件配置。
打開php配置文件胯舷,里面有一行disabel_function的值刻蚯,此處記錄了禁止運(yùn)行的函數(shù),在里面講exec和shell_exec桑嘶,system等函數(shù)刪除炊汹。
2.權(quán)限問題
修改以后PHP可以運(yùn)行部分命令了,但是部分外部程序和命令仍然不能運(yùn)行逃顶。使用sudo返回失敗讨便。
于是運(yùn)行“whoami”查看,環(huán)境下php-frm的運(yùn)行角色是www以政。
于是修改sudoers文件霸褒。
vi /etc/sudoers
將www添加到
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
下面:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
www ALL=(ALL) NOPASSWD:ALL
然后找到Default requiretty這一行,把他注釋掉
# Default requiretty
ps:意思就是sudo默認(rèn)需要tty終端,注釋掉就可以在后臺(tái)執(zhí)行了.
重啟nginx和php-fpm
service nginx restart
service php-fpm restart
這樣,PHP就可以在需要執(zhí)行外部命令的時(shí)候使用sudo利用root身份執(zhí)行命令盈蛮,而不會(huì)報(bào)錯(cuò)或者執(zhí)行失敗了废菱!
ps:exec()返回值說(shuō)明
$result = exec("sudo ssh root@192.168.1.64 systemctl restart smb.service;",$output,$ret_val);
$result ->返回執(zhí)行結(jié)果的最后一行
$output ->返回命令執(zhí)行結(jié)果,數(shù)組形式,可以用print_r來(lái)輸出昙啄。
$ret_val ->返回執(zhí)行成功與否的代碼--=0為成功穆役,其他值為失敗或需要輸入信息等。
當(dāng)然梳凛、最好不要在生產(chǎn)線上環(huán)境使用哦耿币!可以在內(nèi)網(wǎng)機(jī)器上面實(shí)現(xiàn)!
本文僅作為自己備忘記錄韧拒、如果有出入淹接、莫見怪哈!E岩纭K艿俊!