Мне нужно определить, работает ли php как никто. Как мне это сделать?
Есть ли еще какие-нибудь имена для «никого»? "апач"? Любые другие?
Мне нужно определить, работает ли 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_file = tempnam(sys_get_temp_dir(), 'TMP');
было бы создать временный файл в каталоге temp практически в любой системе. Затем вы можете использовать этот файл для получения пользователя / группы. Я оставил часть этого на усмотрение пользователя.
Было бы полезно получить более подробную информацию, но если это система Linux и если php работает под apache, он будет работать так же, как и пользовательский apache.
Простой способ проверить (опять же, предполагая, что некоторая среда похожа на unix) - создать файл php с:
<?php
print shell_exec( 'whoami' );
?>
который даст вам пользователя.
Для моего экземпляра AWS я получаю apache
выходные данные при запуске этого скрипта.
Вы можете попробовать использовать такие обратные кавычки:
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
echo exec('whoami');
?>
Прямо из оболочки можно запустить:
php -r "echo 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 () runningwhoami
в отдельной оболочке тоже не помогает (мне нужны uid и gid, а не имя пользователя).
Однако я нашел полезную подсказку, я мог stat(/proc/self)
иstat(/proc/self/attr)
увидеть в UID и GID файла.
Надеюсь, это поможет кому-то другому
Вы можете использовать эти команды:
<? system('whoami');?>
или
<? passthru('whoami');?>
или
<? print exec('whoami');?>
или
<? print shell_exec('whoami');?>
или
<? print get_current_user();?>
Я обычно использую
<?php echo get_current_user(); ?>
Буду рад если тебе помогло
get_current_user() - Gets the name of the owner of the current PHP script
- не пользователь, запускающий процесс PHP.
Немного поздно, но, несмотря на то, что следующее решение является обходным, оно решает требование, поскольку это работает отлично:
<?
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()
возвращает владельца «текущего запущенного скрипта» - так что, если вы не «показали» скрипт на сервере пользователю веб-сервера, он, скорее всего, будет «никто», или, если разработчик- Пользователь существует в той же ОС, он скорее отобразит это имя пользователя.
Чтобы обойти это, мы создаем файл с текущим запущенным процессом. Если ты простоrequire()
это в текущий запущенный скрипт, он вернет то же самое, что и родительский скрипт, как упоминалось; поэтому нам нужно запустить его как отдельный запрос, чтобы он вступил в силу.
Чтобы сделать это эффективным, рассмотрите возможность запуска шаблона проектирования, который включает в себя «режим выполнения», поэтому, когда сервер находится в «режиме разработки или тестовом режиме», только он может запустить эту функцию и сохранить ее вывод где-нибудь во включаемом , -или просто текст или базу данных, или что-то еще.
Конечно, вы можете изменить некоторые детали приведенного выше кода, если хотите сделать его более динамичным, но логика следующая:
<?php phpinfo(); ?>
сохранить как info.php и
откройте info.php в вашем браузере
ctrl + f, затем введите любой из них:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
вы можете видеть пользователя и группу apache, запущенную как.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Аутентифицированный пользователь