Bash em exec php na página da web não cores para arquivos png e mp3 no Linux

0

Eu tenho código como este em php:

header("Content-Type: text/plain");
exec("/bin/bash -c 'ls --color=always'", $result);
echo implode("\n", $result);

e eu tenho resultado (escape não é visível)

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

Ele mostra códigos de escape ANSI para diretórios e arquivos executáveis, mas quando eu chamo da linha de comando

php -r "exec('bash -c \"ls --color=always\"', \$result);echo implode(\"\n\", \$result);" | less

Eu tenho isto:

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 e mp3 tem códigos de escape ANSI, por que o php exec da página da web não dá isso como retorno?

    
por jcubic 19.02.2014 / 13:56

3 respostas

1

Você provavelmente tem uma variável de ambiente $LS_COLORS definida em algum lugar no seu ~/.bashrc / ~/.zshrc ... (provavelmente por meio de uma chamada de eval "$(dircolors)" ).

O php que você executa na linha de comando herdará o ambiente do seu shell, incluindo essa variável $LS_COLORS .

Enquanto o iniciado por apache2 herdará o ambiente de apache2 , é improvável que tenha $LS_COLORS nele. bash não lê ~/.bashrc (e, de qualquer forma, seria o ~/.bashrc do usuário executando o apache, se assim fosse) quando não fosse executado interativamente (exceto em casos de canto como quando invocado por sshd / rshd / telnetd ).

Observe que php ' exec() já inicia um shell, portanto, não é necessário iniciar outro (especialmente bash , que é o shell mais lento no oeste).

 exec('ls --color=always', $result);

deve ser o suficiente.

$ 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
    
por 19.02.2014 / 14:18
0

porque não está enviando html, mas texto

    
por 19.02.2014 / 13:44
0

No meu arquivo .bashrc existe:

if [ -x /usr/bin/dircolors ]; then
    eval "'dircolors -b'"
fi

que colorem os arquivos.

    
por 19.02.2014 / 14:07