porque o php não pode ver arquivos / tmp

3

eu tenho uma página simples de test.php:

<pre><?php system("ls -la /tmp"); ?></pre>

que sempre mostra apenas: . e .. pastas e nada mais no navegador.

na linha de comando:

1) ls -la /tmp
2) sudo -u http ls -la /tmp
3) php test.php
4) sudo -u http php test.php

todos esses comandos retornam uma lista completa de arquivos de diretório / subdiretórios.

Qual é o motivo disso?

E o problema é a pasta "/ tmp" relacionada porque ls -lah /usr funciona bem.

eu testei isso em 4 comps (um deles era debian com php 5.0.6 e lá php mostra todos os arquivos OK como eu esperava, outros 3 comps tem php7 e mostra vazio / tmp).

update:

mesmo depois de adicionar o arquivo http ao sudoers e rodar 'sudo ls / tmp', o problema é o mesmo nas versões php > 7.

mas executando 'system ("echo aaa > /tmp/aaa.txt; ls -la / tmp") mostra o arquivo . , .. e aaa.txt de propriedade de http: http. Então, isso é uma nova restrição de php e como é possível interferir apenas em arquivos / tmp.

update2:

mas aaa.txt não está dentro de / tmp, e executando find /tmp -name aaa.txt , eu vejo que está dentro de /tmp/systemd-private-2cf1853410ad4ade980ec17e883771c3-httpd.service-lZ22gS/tmp/aaa.txt .

Então, está relacionado a algo chamado " systemd / tmp isolation " ... que eu preciso aprender.

Alterando true para false dentro: /etc/systemd/system/multi-user.target.wants/httpd.service :

[Service]
PrivateTmp=false
...

resolve o meu problema, mas eu estou querendo saber é possível evitar isso sem alterar o arquivo de serviço.

    
por Asain Kujovic 15.02.2017 / 07:32

1 resposta

-1

<pre><?php system("ls -la /tmp"); ?></pre>
..
always shows just: . and .. folders and nothing else in browser. ..
What is the reason for this???

Isso é tudo que a função system() foi projetada para fazer - somente retorna a última linha de saída do comando shell. Então, por que existe um comando que só lhe dá uma linha inútil de saída? possivelmente porque system () permite que você capture o código de saída do processo shell (se você passar $return_var como um segundo argumento) enquanto shell_exec - que fornece toda a saída da shell, não fornece o código de saída!

Portanto, se você quiser toda a saída E o código de saída, você pode usar exec() , mas exec é um incômodo porque a saída completa só está disponível através da matriz de referência $output veja sua saída.

Além disso, como você está brincando com /tmp , você deve estar ciente de que novas versões do PHP-FPM usando systemd para gerenciar o daemon do php-fpm passarão por uma configuração que bloqueia a execução de arquivos php de tmp.
Eu tenho php 7.0.1 em execução no meu laptop, mas depois eu fiz uma instalação de 7.1.1 e descobri que eles estão agora incorporando esta pequena diretiva

PrivateTmp=true

no arquivo de serviço do systemd. você precisa configurá-lo para false se você deseja executar scripts php de /tmp
para obter mais informações sobre esse problema específico link

    
por 15.02.2017 / 09:40