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');
대부분의 시스템에서 임시 디렉토리에 임시 파일을 만듭니다. 그런 다음 해당 파일을 사용하여 사용자 / 그룹을 가져올 수 있습니다. 나는 그 중 일부를 사용자에게 맡겼습니다.
다음과 같이 백틱을 사용해 볼 수 있습니다.
echo `whoami`;
나는 사용할 것이다 :
lsof -i
lsof -i | less
lsof -i | grep :http
이들 중 하나. ssh 명령 줄에 em을 입력하면 어떤 사용자가 어떤 서비스를 듣고 있는지 확인할 수 있습니다.
이 파일을 확인할 수도 있습니다.
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
고마워요.
쉘에서 바로 실행할 수 있습니다.
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을 사용하므로 풀에 따라 다릅니다).
Mario가 위에서 준 posix 기반 솔루션은 완벽 해 보이지만 posix 확장이 --disabled 인 것 같아서 위의 작업을 수행 할 수없고 결과를 whoami
별도의 셸 에서 실행중인 stat () 실행의 응답과 비교하고 싶습니다. 도움이되지도 않습니다 (사용자 이름이 아닌 uid와 gid가 필요합니다).
그러나 나는 내가 할 수있는 유용한 힌트를 발견 stat(/proc/self)
하고 stat(/proc/self/attr)
및 UID를 확인하고 파일의 gid가.
다른 사람에게 도움이되는 희망
나는 보통 사용
<?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()
"현재 실행중인 스크립트"의 소유자를 반환합니다. 따라서 서버의 스크립트를 웹 서버 사용자에게 "chown"하지 않은 경우 대부분 "nobody"이거나 개발자가- 사용자가 동일한 OS에 존재하는 경우 해당 사용자 이름이 표시됩니다.
이 문제를 해결하기 위해 현재 실행중인 프로세스로 파일을 만듭니다. 당신은 단지 경우 require()
이 현재 실행중인 스크립트로, 그것은 언급 한 바와 같이 부모 - 스크립트와 같은를 반환합니다; 따라서 적용하려면 별도의 요청으로 실행해야합니다.
이를 효과적으로 만들기 위해 "런타임 모드"를 통합하는 디자인 패턴을 실행하는 것이 좋습니다. 따라서 서버가 "개발 모드 또는 테스트 모드"에있을 때만이 함수를 실행하고 출력을 include에 저장할 수 있습니다. ,-또는 일반 텍스트 나 데이터베이스 또는 어느 쪽이든.
물론 위의 코드를 좀 더 동적으로 만들고자 할 때 특정 사항을 변경할 수 있지만 논리는 다음과 같습니다.
<?php phpinfo(); ?>
info.php로 저장하고
브라우저에서 info.php를 엽니 다.
ctrl + f를 누른 후 다음 중 하나를 입력합니다.
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
사용자와 apache가 실행중인 그룹을 볼 수 있습니다.