Colors
網頁中的 php exec 中的 Bash 不為 Linux 上的 png 和 mp3 文件著色
我在php中有這樣的程式碼:
header("Content-Type: text/plain"); exec("/bin/bash -c 'ls --color=always'", $result); echo implode("\n", $result);
我得到了結果(轉義不可見)
Makefile README Yann Tiersen - Comptine d'un autre ete L'apres midi.mp3 bush-src.js bush.js bush.min.js [0m[01;34mcgi-bin[0m config.json [01;34mcss[0m favicon.ico foo.png index.php [01;34mlib[0m ls.txt test.php test.php~ [01;32mtest.txt[0m
它顯示目錄和執行檔的 ANSI 轉義碼,但是當我從命令行呼叫時
php -r "exec('bash -c \"ls --color=always\"', \$result);echo implode(\"\\n\", \$result);" | less
我有這個:
bush.js bush.min.js bush-src.js ESC[0mESC[01;34mcgi-binESC[0m config.json ESC[01;34mcssESC[0m favicon.ico ESC[01;35mfoo.pngESC[0m index.php ESC[01;34mlibESC[0m ls.txt Makefile README test.php test.php~ ESC[01;32mtest.txtESC[0m ESC[00;36mYann Tiersen - Comptine d'un autre ete L'apres midi.mp3ESC[0m
png 和 mp3 有 ANSI 轉義碼,為什麼網頁中的 php exec 不把它作為返回?
您可能在/ …
$LS_COLORS
中的某處定義了一個環境變數(可能通過呼叫)。~/.bashrc``~/.zshrc``eval "$(dircolors)"
您在命令行上執行的
php
將繼承您的 shell 環境,包括該$LS_COLORS
變數。雖然一開始的
apache2
將繼承apache2
不太可能存在的環境$LS_COLORS
。當不以互動方式執行時(除非在極端情況下,例如由/ /呼叫時),否則bash
不會讀取~/.bashrc
(無論如何這將是執行 apache 的使用者)。~/.bashrc``sshd``rshd``telnetd
請注意,
php
’exec()
已經啟動了一個 shell,因此您不需要啟動另一個 shell(尤其bash
是西方最慢的 shell)。exec('ls --color=always', $result);
應該足夠了。
$ strace -fe execve php -r 'exec("bash -c echo\ test");' execve("/usr/bin/php", ["php", "-r", "exec(\"bash -c echo\\ test\");"], [/* 49 vars */]) = 0 [pid 3608] execve("/bin/sh", ["sh", "-c", "bash -c echo\\ test"], [/* 49 vars */]) = 0 [pid 3608] execve("/bin/bash", ["bash", "-c", "echo test"], [/* 48 vars */]) = 0