PHP 中 exec() 執行系統外部命令
阿新 • • 發佈:2021-11-24
專案中為了方便快捷的處理問題,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 中要注意檔案許可權問題。