Colors

網頁中的 php exec 中的 Bash 不為 Linux 上的 png 和 mp3 文件著色

  • February 19, 2014

我在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

請注意,phpexec()已經啟動了一個 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

引用自:https://unix.stackexchange.com/questions/115895