어떤 사용자 PHP가 실행 중인지 확인하는 방법은 무엇입니까?


115

PHP가 아무도 실행 중인지 감지해야합니다. 어떻게해야합니까?

"아무도"에 대한 다른 이름이 있습니까? "아파치"? 다른 사람?


"다른 이름이 있습니까?"라는 질문이 정확히 무엇을 의미합니까? 시스템 관리자는 원하는 이름으로 사용자를 만들 수 있습니다.
Álvaro González

서버로 간주 될 수있는 모든 항목에 대한 기타 기본 이름 아파치, 아무도, www가 데이터, 등등
웨슬리

1
올바르게 기억하면 시스템 사용자는 일반적으로 작은 UID (1024 미만?)를가집니다. 그것은 당신이 성취하려는 모든 것에 대한 더 나은 단서가 될 수 있습니다.
Álvaro González


9
get_current_user ()는 사용자 php가 현재 실행중인 것이 아니라 현재 스크립트의 소유자를 반환합니다.
Dima L.

답변:


85

가능한 경우 현재 사용자 계정을 posix_geteuid조사한 다음 posix_getpwuid.

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

그러나 안전 모드에서 실행중인 경우 (종종 exec가 비활성화 된 경우), PHP 프로세스가 기본 www-data또는 apache계정 이외의 다른 곳에서 실행되지 않을 가능성이 높습니다 .


10
에 코멘트 get_current_user() 것을 보여준다이 방법은. PHP 5.4부터 다음과 같이 단축 할 수 있습니다.print posix_getpwuid(posix_geteuid())['name'];
Palec

209

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


1
실제로 exec 또는 시스템 또는 그러한 경유 기능을 사용할 수 없습니다.
Wesley

내가 필요한 것이 었습니다. get_current_user ()는 내가 꼭 필요한 것이 아닙니다.
dgig

5
일부 사용자에게 유용 할 수 있습니다. 명령 줄 인터페이스에서이 명령을 실행 하면 PHP 사용자가 아닌 명령을 실행하는 사용자를 얻게됩니다 .
Bram Vanroy

@BramVanroy 그럼 어디에서 실행해야합니까? = |
Andrew

@BramVanroy-귀하의 의견을 이해하고 싶지만 이해가되지 않습니다. CLI에서 실행하면 현재 PHP 프로세스를 소유 한 사람이 아닙니까? 이 경우 PHP 사용자는 귀하 외에 누구입니까?
billynoah

72

일종의 역방향이지만 exec / system없이 :

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

파일을 생성하는 경우 소유자는 PHP 사용자가됩니다.

이는 tempnam()임시 디렉토리에 임의의 파일을 만들고 해당 파일의 이름을 반환하는와 같은 임시 파일 함수를 사용하여 실행할 수도 있습니다 . 권한과 같은 문제 open_basedir또는 파일 쓰기를 방지하는 안전 모드 로 인해 문제가있는 경우 일반적으로 임시 디렉터리가 계속 허용됩니다.


2
매우 영리한 크로스 플랫폼 솔루션. 우우!
Matt Fletcher

3
니스 : PHP가 실행되는 그룹 을 찾을 수있는 유일한 비 권한 솔루션 입니다.
tanius

2
가치있는 해킹, 더 높은 곳을받을 권리
아브라함 필립에게

1
@RavinderPayal 내가 제안한 것처럼 tempnam 기능을 사용하지 않는 한. 사용자가 누구인지에 관계없이 임시 디렉토리에 쓸 수 있다는 것은 거의 보장됩니다. 임시 디렉토리에 쓸 수없는 경우 폴더에 777 권한을 임시로 부여하고 활성화 된 경우 해당 경로에 대해 selinux를 비활성화 할 수 있습니다.
조나단 쿤

1
@RavinderPayal 임시 경로를 반환하는 추가 함수가 있습니다. 따라서 $temp_file = tempnam(sys_get_temp_dir(), 'TMP');대부분의 시스템에서 임시 디렉토리에 임시 파일을 만듭니다. 그런 다음 해당 파일을 사용하여 사용자 / 그룹을 가져올 수 있습니다. 나는 그 중 일부를 사용자에게 맡겼습니다.
Jonathan Kuhn

20

자세한 내용은 유용 할 수 있지만 Linux 시스템이고 php가 아파치에서 실행되고 있다고 가정하면 사용자 아파치가 실행되는 방식으로 실행됩니다.

확인하는 쉬운 방법 (다시 말하지만 환경과 같은 일부 유닉스를 가정)은 다음을 사용하여 php 파일을 만드는 것입니다.

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

그것은 당신에게 사용자를 줄 것입니다.

내 AWS 인스턴스의 apache경우이 스크립트를 실행할 때 출력으로 표시됩니다.


16

다음과 같이 백틱을 사용해 볼 수 있습니다.

echo `whoami`;

7
위의 질문과 중복됩니다.
volter9 2014-08-22

2
일부 사용자에게 유용 할 수 있습니다. 명령 줄 인터페이스에서이 명령을 실행 하면 PHP 사용자가 아닌 명령을 실행하는 사용자를 얻게됩니다 .
브람 Vanroy

12

나는 사용할 것이다 :

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_

1
grep "APACHE_RUN_" /etc/apache2/envvars고마워요.
Tarik

11

exec('whoami') 이것을 할 것이다

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

실제로 exec 또는 시스템 또는 그러한 경유 기능을 사용할 수 없습니다.
Wesley

@Wesley : 불가능합니다.
창세기

2
일부 사용자에게 유용 할 수 있습니다. 명령 줄 인터페이스에서이 명령을 실행 하면 PHP 사용자가 아닌 명령을 실행하는 사용자를 얻게됩니다 .
브람 Vanroy


1

info.php 파일을 다음 디렉토리에 추가하십시오-기본 http / apache 디렉토리-일반적으로 / var / www / html

다음 내용으로

<?php                                                                           
phpinfo();                                                                    
?>  

그런 다음 httpd / apache는 기본 html 디렉토리 http://enter.server.here/info.php 로 이동을 다시 시작합니다 .

전체 PHP 혈통을 전달할 것입니다!


3
해당 출력에서 ​​어떤 변수 / 값을 찾고 있습니까?
Andrew

이미 이것을 찾았지만 해당 페이지에서 "사용자"를 검색 하시겠습니까?
CRTLBREAK

0

내 설정에서 프로세스를 시작하기 전에 현재 프로세스에 폴더, 하위 폴더 및 파일을 생성 할 수있는 권한이 있는지 확인하고 할 수없는 경우 솔루션을 제안하고 싶습니다. stat(<file>)권한이 실행중인 프로세스의 권한과 일치하는지 확인하기 위해 다양한 작업 을 실행 하고 싶었습니다 (나는 php-fpm을 사용하므로 풀에 따라 다릅니다).
Mario가 위에서 준 posix 기반 솔루션은 완벽 해 보이지만 posix 확장이 --disabled 인 것 같아서 위의 작업을 수행 할 수없고 결과를 whoami별도의 셸 에서 실행중인 stat () 실행의 응답과 비교하고 싶습니다. 도움이되지도 않습니다 (사용자 이름이 아닌 uid와 gid가 필요합니다).

그러나 나는 내가 할 수있는 유용한 힌트를 발견 stat(/proc/self)하고 stat(/proc/self/attr)및 UID를 확인하고 파일의 gid가.

다른 사람에게 도움이되는 희망


0

다음 명령을 사용할 수 있습니다.

<? system('whoami');?>

또는

<? passthru('whoami');?>

또는

<? print exec('whoami');?>

또는

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

또는

<? print get_current_user();?>

get_current_user ()는 현재 사용자를 반환 하지 않습니다 . 이 함수가 호출 된 스크립트의 소유자를 반환합니다.
andsens

-1

나는 보통 사용

<?php echo get_current_user(); ?>

그것이 당신을 도왔다면 기뻐할 것입니다


이것은 질문의 주석에서 이미 언급되었으며 스크립트가 실행되는 사용자와 거의 관련이 없습니다.
Palec

get_current_user() - Gets the name of the owner of the current PHP script- 되지 는 PHP 프로세스를 실행하는 사용자.
Francisco Zarabozo 2017

-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 

echo $_SERVER["USER"];작동하지만 SSH에 현재 로그인 된 사용자 이름을 제공합니다.
Tarik

-1

신청

약간 늦었지만 다음이 해결 방법이지만 제대로 작동하므로 요구 사항을 해결합니다.

<?
    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에 저장할 수 있습니다. ,-또는 일반 텍스트 나 데이터베이스 또는 어느 쪽이든.

물론 위의 코드를 좀 더 동적으로 만들고자 할 때 특정 사항을 변경할 수 있지만 논리는 다음과 같습니다.

  • 다른 사용자와의 간섭을 제한하기 위해 고유 한 참조를 정의합니다.
  • 임시 파일 작성을위한 로컬 파일 경로 정의
  • 자체 프로세스에서이 파일을 실행할 공용 URL / 경로를 정의하십시오.
  • 스크립트 소유자 이름을 출력하는 임시 PHP 파일 작성
  • 요청하여이 스크립트의 출력을 가져옵니다.
  • 더 이상 필요하지 않은 파일을 삭제하거나 원하는 경우 그대로 둡니다.
  • 요청의 출력을 함수의 반환 값으로 반환

-1
<?php phpinfo(); ?>

info.php로 저장하고

브라우저에서 info.php를 엽니 다.

ctrl + f를 누른 후 다음 중 하나를 입력합니다.

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

사용자와 apache가 실행중인 그룹을 볼 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.