Как проверить, какой пользователь php работает?

76

Мне нужно определить, работает ли php как никто. Как мне это сделать?

Есть ли другие имена для "никто"? "Апач"? Любые другие?

  • 0
    Что вы имеете в виду именно под вопросом «есть ли другие имена»? Системные администраторы могут создавать пользователей с любым именем, которое они хотят.
  • 0
    Любые другие имена по умолчанию для всего, что может считаться сервером; apache, nobody, www-data и т.д ..
Показать ещё 4 комментария
Теги:

12 ответов

52
Лучший ответ

Если доступно, вы можете исследовать текущую учетную запись пользователя с помощью posix_geteuid а затем получить имя пользователя с помощью posix_getpwuid.

$username = posix_getpwuid(posix_geteuid())['name'];

Однако, если вы работаете в безопасном режиме (что часто бывает, когда exec отключен), то маловероятно, что ваш PHP-процесс работает под чем угодно, кроме учетной записи www-data или apache по умолчанию.

  • 9
    На get_current_user() есть комментарий , демонстрирующий этот подход. Начиная с PHP 5.4 его можно сократить до следующего: print posix_getpwuid(posix_geteuid())['name'];
161

<?php echo exec('whoami'); ?>

  • 1
    На самом деле не могу использовать exec, system или другие подобные промежуточные функции.
  • 2
    @EdsonMedina Кажется, хорошо работает на окнах!
Показать ещё 4 комментария
55

Вид обратного пути, но без exec/system:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

Если вы создадите файл, владелец будет пользователем PHP.

Это также может быть запущено с любой из временных файловых функций, таких как tempnam(), которая создает случайный файл во временном каталоге и возвращает имя этого файла. Если есть проблемы из-за чего-то вроде разрешений, open_basedir или безопасного режима, который предотвращает запись файла, как правило, каталог temp все равно будет разрешен.

  • 2
    Очень умное кроссплатформенное решение. Бох!
  • 3
    Приятно: единственное непривилегированное решение здесь, чтобы также найти группу , под которой работает PHP.
Показать ещё 7 комментариев
19

Более подробная информация была бы полезна, но если предположить, что это Linux-система, и предположим, что php работает под apache, она будет работать так же, как и любой пользовательский apache, выполняемый как.

Простой способ проверить (опять же, предполагая некоторую среду, похожую на unix) - создать php файл с помощью

<?php
    print shell_exec( 'whoami' );
?>

который предоставит вам пользователя.

Для моего экземпляра AWS я получаю apache как вывод, когда я запускаю этот script.

13

Вы можете попробовать использовать обратные такты:

echo `whoami`;
  • 1
    Не уверен, почему это не имеет голосов. Потрясающая работа там ...
  • 5
    Это просто дубликат вопросов выше.
Показать ещё 1 комментарий
7

я использовал бы:

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_
  • 1
    grep "APACHE_RUN_" /etc/apache2/envvars работает хорошо, спасибо.
6

exec('whoami') сделает это

<?php
exec('whoami');
?>
  • 0
    На самом деле не могу использовать exec, system или другие подобные промежуточные функции.
  • 0
    @ Уэсли: так что это невозможно.
Показать ещё 2 комментария
2

добавьте файл info.php в следующий каталог - ваш каталог http/apache по умолчанию - обычно /var/www/html

со следующим содержанием

<?php                                                                           
phpinfo();                                                                    
?>  

Затем перезапуск httpd/apache перейдите в свой html-каталог по умолчанию http://enter.server.here/info.php

предоставит всю родословную php!

  • 1
    и какую переменную / значение в этом выходе мы ищем?
  • 0
    Я уверен, что вы уже нашли это, но ищете "пользователя" на этой странице?
1

В моей настройке я хочу проверить, разрешено ли текущему процессу создавать папки, вложенные папки и файлы, прежде чем начинать процесс, и предложить решение, если оно похоже на то, что я не могу. Я хотел запустить stat(<file>) для разных целей, чтобы обеспечить соответствие разрешений для выполняемого процесса (я использую php-fpm, поэтому он зависит от пула).
Решение, созданное на основе posix, описанное Марио выше, кажется идеальным, однако кажется, что расширение posix --disabled, поэтому я не мог выполнить вышеописанное, и поскольку я хочу сравнить результаты с ответом от запуска stat(), выполняющего whoami в отдельная оболочка тоже не полезна (мне нужны uid и gid, а не имя пользователя).

Однако я нашел полезный намек, я мог stat(/proc/self) и stat(/proc/self/attr) и видеть uid и gid файла.

Надеюсь, что кто-то еще поможет

0

Предложение

Немного поздно, но, несмотря на то, что следующее является обходным, оно решает требование, поскольку это работает очень хорошо:

<?
    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() возвращает владельца "текущего запуска script", поэтому, если вы не "chown" a script на сервере для пользователя веб-сервера, он, скорее всего, быть "никому", или если разработчик-пользователь существует в той же ОС, он скорее отобразит это имя пользователя.

Чтобы обойти это, мы создаем файл с текущим запуском процесса. Если вы просто require() в текущем запуске script, он будет возвращать то же самое, что и parent-script, как указано; поэтому нам нужно запустить его как отдельный запрос для вступления в силу.

Процесс потока

Чтобы сделать это эффективным, подумайте о запуске шаблона проектирования, который включает в себя "режим выполнения", поэтому, когда сервер находится в "режиме разработки или в тестовом режиме", тогда только он может запустить эту функцию и сохранить ее выход где-то в include, или просто текст или базу данных, или в зависимости от того, какой из них.

Конечно, вы можете изменить некоторые особенности кода выше, так как вы хотите сделать его более динамичным, но логика выглядит следующим образом:

  • определить уникальную ссылку на ограничение помех другим пользователям
  • определить локальный путь к файлу для записи временного файла
  • определить общий URL-адрес/путь для запуска этого файла в собственном процессе
  • напишите временный файл php, который выводит имя владельца script
  • получить результат этого script, сделав запрос к нему
  • удалить файл, поскольку он больше не нужен - или оставить его, если вы хотите
  • возвращает результат запроса в качестве возвращаемого значения функции
0
$_SERVER["USER"]

$_SERVER["USERNAME"] 
  • 0
    echo $_SERVER["USER"]; работает, но выдает текущее имя пользователя в SSH.
0

Я обычно использую

<?php echo get_current_user(); ?>

Буду рад, если это поможет вам

  • 0
    Это уже упоминалось в комментариях к вопросу, и это имеет очень мало общего с пользователем, под которым выполняется скрипт.
  • 0
    get_current_user() - Gets the name of the owner of the current PHP script не пользователя, выполняющего процесс PHP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню