1. 程式人生 > 其它 >PHP 中 exec() 執行系統外部命令

PHP 中 exec() 執行系統外部命令

專案中為了方便快捷的處理問題,PHP 結合 shell 指令碼非常常見。

一、怎麼用

exec (string command [, string array [, int return_var]])

// string command  命令列

// string array  命令列返回的所有結果,是個陣列

// int return_var  命令執行結果,正常為 0,否則有錯誤。

二、常見問題

exec() 函式用法很簡單,但是使用過程中很可能會出現一些問題。

1、執行命令後毫無反應,不知道發生了什麼

首先檢查 PHP 配置,確認是否開啟了安全模式。

safe_mode=on|off

① 預設情況下,安全模式是關閉的,啟用時,一些限制會生效。

② 所有輸入輸出函式,只能用於與呼叫這些函式的指令碼有相同擁有者的檔案。

fopen()
file()
require()

③只有當指令碼位於safe_mode_exec_dir配置指定的目錄,才能通過函式 popen()、system()、exec() 等執行指令碼。

④ 安全模式受影響的函式

apache_request_headers()
backticks()
chdir()
chgrp()
chmode()
chown()
copy()
dbase_open()
dbmopen()
dl()
exec()
filepro()
filepro_retrieve()
filepro_rowcount()
fopen() header() highlight_file() ifx_* ingres_* link() mail() max_execution_time() mkdir() move_uploaded_file() mysql_* parse_ini_file() passthru() pg_lo_import() popen() posix_mkfifo() putenv() rename() zmdir() set_time_limit() shell_exec() show_source() symlink() system() touch()

2、簡單 linux 命令可以執行,涉及到處理檔案的命令不好用。

exec('cmd.sh > /tmp/cmd.log 2>&1', $out, $status)

把執行指令碼 cmd.sh 的正常異常輸出寫入/tmp/cmd.log 檔案。然後根據錯誤提示對症下藥。

注意為了避免檔案許可權問題,log 檔案一定要放在所有使用者都可寫入的目錄。

3、log 檔案中提示檔案許可權問題

① 在 PHP 檔案中列印執行檔案的使用者,就會明白為什麼會出現許可權問題。

echo shell_exec('whoami');

② 假設執行檔案的使用者是 daemon,但是要處理的檔案是另外的使用者,就需要指定使用者執行 sh 指令碼。

// runuser 指定執行指令碼的使用者
// runuser 只能用於 root 使用者,所以前面加 sudo
exec
("sudo runuser owner -s /bin/bash -c 'cmd.sh $id' >> /tmp/cmd.log 2>&1");

4、提示sudo: no tty present and no askpass program specified

是因為用 sudo 相當於用 root 使用者許可權, 需要設定 daemon 使用者免密碼登入到 root

# vim /etc/sudoers
daemon ALL = NOPASSWD: ALL

這樣 exec() 就可以順利執行啦。

Linux 中要注意檔案許可權問題。