Мне нужно определить, работает ли php как никто. Как мне это сделать?
Есть ли другие имена для "никто"? "Апач"? Любые другие?
Если доступно, вы можете исследовать текущую учетную запись пользователя с помощью posix_geteuid
а затем получить имя пользователя с помощью posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Однако, если вы работаете в безопасном режиме (что часто бывает, когда exec отключен), то маловероятно, что ваш PHP-процесс работает под чем угодно, кроме учетной записи www-data
или apache
по умолчанию.
get_current_user()
есть комментарий , демонстрирующий этот подход. Начиная с PHP 5.4 его можно сократить до следующего: print posix_getpwuid(posix_geteuid())['name'];
<?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
как вывод, когда я запускаю этот script.
Вы можете попробовать использовать обратные такты:
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_
grep "APACHE_RUN_" /etc/apache2/envvars
работает хорошо, спасибо.
exec('whoami')
сделает это
<?php
exec('whoami');
?>
добавьте файл info.php в следующий каталог - ваш каталог http/apache по умолчанию - обычно /var/www/html
со следующим содержанием
<?php
phpinfo();
?>
Затем перезапуск httpd/apache перейдите в свой html-каталог по умолчанию http://enter.server.here/info.php
предоставит всю родословную php!
В моей настройке я хочу проверить, разрешено ли текущему процессу создавать папки, вложенные папки и файлы, прежде чем начинать процесс, и предложить решение, если оно похоже на то, что я не могу. Я хотел запустить stat(<file>)
для разных целей, чтобы обеспечить соответствие разрешений для выполняемого процесса (я использую php-fpm, поэтому он зависит от пула).
Решение, созданное на основе posix, описанное Марио выше, кажется идеальным, однако кажется, что расширение posix --disabled, поэтому я не мог выполнить вышеописанное, и поскольку я хочу сравнить результаты с ответом от запуска stat(), выполняющего whoami
в отдельная оболочка тоже не полезна (мне нужны uid и gid, а не имя пользователя).
Однако я нашел полезный намек, я мог stat(/proc/self)
и stat(/proc/self/attr)
и видеть uid и gid файла.
Надеюсь, что кто-то еще поможет
Немного поздно, но, несмотря на то, что следующее является обходным, оно решает требование, поскольку это работает очень хорошо:
<?
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, или просто текст или базу данных, или в зависимости от того, какой из них.
Конечно, вы можете изменить некоторые особенности кода выше, так как вы хотите сделать его более динамичным, но логика выглядит следующим образом:
$_SERVER["USER"]
$_SERVER["USERNAME"]
echo $_SERVER["USER"];
работает, но выдает текущее имя пользователя в SSH.
Я обычно использую
<?php echo get_current_user(); ?>
Буду рад, если это поможет вам
get_current_user() - Gets the name of the owner of the current PHP script
не пользователя, выполняющего процесс PHP.