Мне нужно определить, работает ли php как никто. Как мне это сделать?
Есть ли другие имена для «никто»? «Апач»? Любые другие?
Если доступно, вы можете исследовать текущую учетную запись пользователя с помощью posix_geteuid
а затем получить имя пользователя с помощью posix_getpwuid
.
Однако, если вы работаете в безопасном режиме (что часто бывает, когда exec отключен), то маловероятно, что ваш PHP-процесс запущен ничем, кроме учетной записи www-data
или apache
по умолчанию.
<?php echo exec('whoami'); ?>
Вид назад, но без exec / system:
file_put_contents("testFile", "test"); $user = fileowner("testFile"); unlink("testFile");
Если вы создадите файл, владелец будет пользователем PHP.
Вероятно, это также можно запустить с любой из временных функций файла, таких как tempnam()
, которая создает случайный файл во временном каталоге и возвращает имя этого файла. Если есть проблемы из-за чего-то вроде разрешений, open_basedir
или безопасного режима, которые предотвращают запись файла, как правило, каталог temp все равно будет разрешен.
Более подробная информация была бы полезна, но, предполагая, что это Linux-система, и предполагая, что php работает под apache, он будет запускаться, как всегда работает apache.
Простой способ проверить (опять же, предполагая некоторую среду, похожую на unix) – создать файл php с:
<?php print shell_exec( 'whoami' ); ?>
который предоставит вам пользователя.
Для моего экземпляра AWS я запускаю apache
качестве вывода, когда запускаю этот скрипт.
Вы можете попробовать использовать backticks следующим образом:
echo `whoami`;
я хотел бы использовать:
lsof -i lsof -i | less lsof -i | grep :http
любой из этих. Вы можете ввести em в свою командную строку ssh, и вы увидите, какой пользователь прослушивает какой сервис.
вы также можете пойти и проверить этот файл:
more /etc/apache2/envvars
и ищите эти строки:
export APACHE_RUN_USER=user-name export APACHE_RUN_GROUP=group-name
чтобы отфильтровать данные файла envvars, вы можете использовать grep:
more /etc/apache2/envvars |grep APACHE_RUN_
exec('whoami')
сделает это
<?php exec('whoami'); ?>
В моей настройке я хочу проверить, разрешено ли текущему процессу создавать папки, вложенные папки и файлы, прежде чем начинать процесс, и предложить решение, если оно похоже на то, что я не могу. Я хотел запустить stat(<file>)
для разных вещей, чтобы обеспечить соответствие разрешений для выполняемого процесса (я использую php-fpm, поэтому он зависит от пула).
Решение, основанное на посиксе, которое Марио дал выше, кажется идеальным, однако кажется, что расширение posix – отключено, поэтому я не мог сделать выше, и, поскольку я хочу сравнить результаты с ответом от запуска stat (), запускающего whoami
в отдельном shell тоже не помогает (мне нужен uid и gid, а не имя пользователя).
Однако я нашел полезный намек, я мог бы стать stat(/proc/self)
и stat(/proc/self/attr)
и видеть uid и gid файла.
Надежда, которая помогает кому-то еще
добавьте файл info.php в следующий каталог – ваш каталог http / apache по умолчанию – обычно / var / www / html
со следующим содержанием
<?php phpinfo(); ?>
Затем httpd / apache перезапустите go в свой html-каталог по умолчанию http://enter.server.here/info.php
будет доставлять всю родословную php!
Обычно я использую
<?php echo get_current_user(); ?>
Буду рад, если это поможет вам
$_SERVER["USER"] $_SERVER["USERNAME"]
Немного поздно, но, несмотря на то, что следующее является обходным, оно решает требование, поскольку это работает очень хорошо:
<? function get_sys_usr() { $unique_name = uniqid(); // not-so-unique id $native_path = "./temp/$unique_name.php"; $public_path = "http://example.com/temp/$unique_name.php"; $php_content = "<? echo get_current_user(); ?>"; $process_usr = "apache"; // fall-back if (is_readable("./temp") && is_writable("./temp")) { file_put_contents($native_path,$php_content); $process_usr = trim(file_get_contents($public_path)); unlink($native_path); } return $process_usr; } echo get_sys_usr(); // www-data ?>
Выделение кода выше неточно, скопируйте и вставьте в свой любимый редактор и посмотрите в виде кода PHP, или сохраните и протестируйте его самостоятельно.
Как вы, вероятно, знаете, get_current_user()
возвращает владельца «текущего скрипта» – поэтому, если вы не «chown» сценарий на сервере для пользователя веб-сервера, он скорее всего будет «никем», или если разработчик-пользователь существует в одной и той же ОС, он скорее отобразит это имя пользователя.
Чтобы обойти это, мы создаем файл с текущим запущенным процессом. Если вы просто require()
в текущем запущенном скрипте, он будет возвращать то же самое, что и родительский скрипт, как указано; поэтому нам нужно запустить его как отдельный запрос для вступления в силу.
Чтобы сделать это эффективным, рассмотрите возможность запуска шаблона проектирования, который включает в себя «режим выполнения», поэтому, когда сервер находится в «режиме разработки или тестовом режиме», тогда только он может запустить эту функцию и сохранить ее выход где-нибудь в include , или просто текст или базу данных, или в зависимости от того.
Конечно, вы можете изменить некоторые особенности кода выше, поскольку вы хотите сделать его более динамичным, но логика выглядит следующим образом: