首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 執行 Linux 系統命令函數對比:system、exec、popen 及服務器監控實戰

     編輯:PHP 綜合知識

三大函數對比

函數返回值輸出行為適用場景
system()最後一行(字符串)直接輸出到瀏覽器/標準輸出簡單命令、需即時顯示輸出
exec()最後一行(字符串),可選參數接收所有行數組不自動輸出捕獲輸出進一步處理
popen()文件指針(資源)管道讀/寫,需 pclose() 關閉大數據流、雙向交互

代碼示例

system()

$last = system('ls', $retval);
echo "Last line: $last\nReturn: $retval";

exec()

echo exec('whoami'); // 單行
$output = [];
$code = 0;
exec('ls -la', $output, $code); // $output 接收所有行
print_r($output);

popen()

$fp = popen('/bin/ls', 'r');
while (!feof($fp)) {
    echo fgets($fp, 1024);
}
pclose($fp);

安全鐵律

  • 所有用戶輸入參與命令必須經過 escapeshellarg() 或 escapeshellcmd() 轉義
  • 禁用 shell_exec、passthru、`反引號` 等高風險函數(disable_functions)
  • 最小權限原則:Web 用戶不可為 root,命令腳本專用、只讀

實戰:PHP 監控 Linux 負載(繞過 root 限制)

思路

Web 用戶無權執行 w/top 等命令。編寫 C 程序 setuid(root) 執行特權命令,PHP 調用該二進制。

C 程序 w.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    uid_t uid = getuid(), euid = geteuid();
    if (setreuid(euid, uid)) perror("setreuid");
    system("/usr/bin/w");
    return 0;
}
gcc -o w -Wall w.c
chown root:root w
chmod u+s w  # 設置 SUID

PHP 調用

$last = exec('/usr/local/ismole/w', $output);
$load = explode("load average: ", $output[0])[1];
echo $load; // 輸出如 "0.15, 0.10, 0.05"

擴展應用

  • SVN/Git 自動更新部署
  • 數據庫備份 mysqldump + 壓縮
  • 日志切割、清理
  • 服務重啟(systemctl 需 sudoers 配置)

現代化替代

推薦使用 SSH2 擴展(ssh2_exec)或 Ansible/SaltStack 遠程執行,避免本地 SUID 風險;容器化環境下用 docker exec / Kubernetes Job。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved