o script php não pode acessar a pasta / tmp

10

Eu não tenho open_basedir, php pode acessar / etc / usr / proc / home etc ... mas não / tmp.

tmpfs é montado em / tmp (/ tmp type tmpfs (rw)) Essa também é a razão pela qual eu quero usar a pasta / tmp.

Meus arquivos são de propriedade de http (usuário para nginx e php) e podem ser lidos por todos.

sudo -u http cat /tmp/file está funcionando, mas qualquer coisa dentro de um script PHP não (como file_exist () ou file ()).

edit: o erro mostrado no log:

PHP Warning:  file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267

edit2: Eu testei o problema de outra maneira. Eu fiz

touch("/tmp/boo");
file_exist("/tmp/boo");

e file_exist retornam true para que o arquivo seja criado. Então eu assisti dentro / tmp e nenhum arquivo "boo" pode ser encontrado lá. Isso é o que eu estava com medo, php não «ver» o ponto de montagem. Por que isso e como posso consertar isso?

    
por eephyne 23.07.2014 / 11:49

1 resposta

20

Descobri porque, bem, alguém me deu a dica global.

Não é culpa do php ou do tmpfs. O culpado foi systemd e seu sistema de segurança PrivateTmp .

Para aqueles que entram no mesmo problema que eu, o serviço php (e provavelmente alguns outros) tem a opção PrivateTmp para true no script systemd ( /usr/lib/systemd/system ).

Nesse caso, um novo /tmp é criado e isolado do outro. Todos os dados salvos dentro são excluídos assim que o serviço é interrompido.

É uma medida de segurança, pois /tmp pode conter muitas informações confidenciais e o script php nem sempre é seguro.

Para desativar isso, basta copiar o script dentro de /etc/systemd/system (para evitar a substituição de suas alterações após uma atualização) e defina PrivateTmp para false .

Você também pode definir dois ou mais serviços para compartilhar o mesmo / tmp usando JoinsNamespaceOf .

Para mais informações > man systemd.exec

    
por 24.07.2014 / 08:25