Существует сценарий оболочки (bash), работающий на CentOS с SE Linux, установленным на Permissive, и он имеет только одну цель - записать что-то в файл:
[root@centos ~]$ cat /var/www/html/test.php
<?php
$output=shell_exec("/opt/sms/script.sh");
var_dump($output);
?>
[root@centos ~]$ cat /opt/sms/script.sh
#!/bin/bash
whoami > /tmp/a.txt
cat /tmp/a.txt
[root@centos ~]$ php -f /var/www/html/test.php
string(5) "root
"
[root@centos ~]$
Все хорошо уже! Но теперь давайте назовем его через PHP exe c, используя Apache, и вы получите в своем браузере следующее:
string(7) "apache "
, что все еще хорошо, пока вы не сделаете это:
[root@centos ~]$ cat /tmp/a.txt
root
[root@centos ~]$
что?
И затем вы делаете это:
[root@centos ~]$ find / -name a.txt 2>/dev/null
/tmp/systemd-private-689e87297de1452e98dcfaa5bd686a1f-httpd.service-gMJKi0/tmp/a.txt
/tmp/a.txt
[root@centos ~]$ cat /tmp/systemd-private-689e87297de1452e98dcfaa5bd686a1f-httpd.service-
gMJKi0/tmp/a.txt
apache
[root@centos ~]$ cat /tmp/a.txt
root
[root@centos ~]$
Вопрос: почему вывод записывается в этот / tmpp / systemd - * / tmp. Файл .txt вместо простого /tmp/a.txt? Я предоставил АБСОЛЮТНЫЙ путь, который должен служить очень очевидной цели. Как / где контролируется, что мой вывод записан в другом месте?