Làm thế nào để kiểm tra php người dùng đang chạy như thế nào?


115

Tôi cần phát hiện xem php có đang chạy không. Làm thế nào để tôi làm điều này?

Có tên nào khác cho "không ai cả" không? "apache"? Bất kì thứ khác?


Ý bạn chính xác là gì với câu hỏi "có những cái tên nào khác"? Sysadmins có thể tạo người dùng với bất kỳ tên nào họ muốn.
Álvaro González,

Bất kỳ tên mặc định nào khác cho bất kỳ thứ gì có thể được coi là máy chủ; apache, không ai, www-data, vv ..
Wesley

1
Nếu tôi nhớ chính xác, người dùng hệ thống thường có UID nhỏ (dưới 1024?). Đó có thể là một manh mối tốt hơn cho bất cứ điều gì bạn đang cố gắng hoàn thành.
Álvaro González


9
get_current_user () trả về chủ sở hữu của tập lệnh hiện tại, không phải người dùng php hiện đang chạy.
Dima L.

Câu trả lời:


85

Nếu có, bạn có thể thăm dò tài khoản người dùng hiện tại posix_geteuidvà sau đó lấy tên người dùng posix_getpwuid.

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

Tuy nhiên, nếu bạn đang chạy ở chế độ an toàn (thường xảy ra khi chế độ thực thi bị tắt), thì không có khả năng quy trình PHP của bạn đang chạy dưới bất kỳ điều gì ngoại trừ tài khoản www-datahoặc apachetài khoản mặc định .


10
một bình luận trên get_current_user()trang chủ cho thấy cách làm này. Kể từ PHP 5.4, nó có thể được rút ngắn thành:print posix_getpwuid(posix_geteuid())['name'];
Palec

209

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


1
Không thể thực sự sử dụng thực thi hoặc hệ thống hoặc bất kỳ chức năng passthru nào như vậy.
Wesley

Chỉ là những gì tôi cần. get_current_user () chắc chắn không phải là thứ tôi cần.
dgig

5
Có thể hữu ích với một số người dùng: nếu bạn chạy điều này từ giao diện dòng lệnh, bạn sẽ nhận được người dùng chạy lệnh chứ không phải người dùng PHP.
Bram Vanroy

@BramVanroy thì bạn nên chạy nó ở đâu? = |
Andrew

@BramVanroy - Tôi muốn hiểu nhận xét của bạn, nhưng tôi không hiểu. nếu bạn chạy nó từ cli, bạn không phải là người sở hữu quy trình php hiện tại? Người dùng PHP trong trường hợp này ngoài bạn là ai?
billynoah

72

Loại ngược, nhưng không có thực thi / hệ thống:

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

Nếu bạn tạo một tệp, chủ sở hữu sẽ là người dùng PHP.

Điều này cũng có thể được chạy với bất kỳ chức năng tệp tạm thời nào, chẳng hạn như chức năng tempnam()này tạo tệp ngẫu nhiên trong thư mục tạm thời và trả về tên của tệp đó. Nếu có vấn đề do một số vấn đề như quyền open_basedirhoặc chế độ an toàn ngăn cản việc ghi tệp, thông thường, thư mục tạm thời sẽ vẫn được phép.


2
Giải pháp nền tảng chéo rất thông minh. Boh!
Matt Fletcher

3
Tuyệt vời: giải pháp không đặc quyền duy nhất ở đây cũng để tìm nhóm mà PHP đang chạy.
tanius

2
một bản hack xứng đáng, xứng đáng có một vị trí cao hơn
Abraham Philip

1
@RavinderPayal Trừ khi bạn sử dụng hàm tempnam như tôi đã đề xuất. Gần như đảm bảo rằng người dùng có thể ghi vào thư mục tạm thời bất kể họ là ai. Nếu không thể ghi vào thư mục tạm thời, bạn có thể tạm thời cấp cho thư mục 777 quyền và nếu được bật, hãy tắt selinux cho đường dẫn đó.
Jonathan Kuhn

1
@RavinderPayal có các chức năng bổ sung để trả về đường dẫn tạm thời. Vì vậy, $temp_file = tempnam(sys_get_temp_dir(), 'TMP');sẽ tạo một tệp tạm thời trong thư mục tạm thời trên hầu hết mọi hệ thống. Sau đó, bạn có thể sử dụng tệp đó để lấy người dùng / nhóm. Tôi để lại một số điều đó cho người dùng tìm hiểu.
Jonathan Kuhn

20

Các chi tiết khác sẽ hữu ích, nhưng giả sử đó là một hệ thống linux và giả sử php đang chạy dưới apache, nó sẽ chạy như những gì mà apache người dùng chạy.

Một cách dễ dàng để kiểm tra (một lần nữa, giả sử một số môi trường giống unix) là tạo tệp php với:

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

sẽ cung cấp cho bạn người dùng.

Đối với trường hợp AWS của tôi, tôi nhận được apacheđầu ra khi chạy tập lệnh này.


16

Bạn có thể thử sử dụng các que tính ngược như thế này:

echo `whoami`;

7
Nó chỉ là bản sao của các câu hỏi ở trên.
volter

2
Có thể hữu ích với một số người dùng: nếu bạn chạy điều này từ giao diện dòng lệnh, bạn sẽ nhận được người dùng chạy lệnh chứ không phải người dùng PHP.
Bram Vanroy

12

tôi sẽ dùng:

lsof -i
lsof -i | less
lsof -i | grep :http

bất kỳ trong số này. Bạn có thể nhập chúng vào dòng lệnh ssh của mình và bạn sẽ thấy người dùng đang nghe dịch vụ nào.

bạn cũng có thể truy cập và kiểm tra tệp này:

more /etc/apache2/envvars

và tìm những dòng sau:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

để lọc ra dữ liệu tệp envvars, bạn có thể sử dụng grep:

 more  /etc/apache2/envvars |grep APACHE_RUN_

1
grep "APACHE_RUN_" /etc/apache2/envvarshoạt động tốt, cảm ơn.
Tarik

11

exec('whoami') sẽ làm điều này

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

Không thể thực sự sử dụng thực thi hoặc hệ thống hoặc bất kỳ chức năng passthru nào như vậy.
Wesley

@Wesley: vậy là không được đâu.
genesis

2
Có thể hữu ích với một số người dùng: nếu bạn chạy điều này từ giao diện dòng lệnh, bạn sẽ nhận được người dùng chạy lệnh chứ không phải người dùng PHP.
Bram Vanroy


1

thêm tệp info.php vào thư mục sau - thư mục http / apache mặc định của bạn - normal / var / www / html

với những nội dung sau

<?php                                                                           
phpinfo();                                                                    
?>  

Sau đó, khởi động lại httpd / apache và chuyển đến thư mục html mặc định của bạn http://enter.server.here/info.php

sẽ cung cấp toàn bộ phả hệ php!


3
và biến / giá trị nào trong đầu ra đó mà chúng ta đang tìm kiếm?
Andrew

Tôi chắc rằng bạn đã tìm thấy điều này nhưng tìm kiếm "người dùng" trên trang đó?
CRTLBREAK

0

Trong thiết lập của mình, tôi muốn kiểm tra xem quy trình hiện tại có quyền tạo thư mục, thư mục con và tệp hay không trước khi tôi bắt đầu quy trình và đề xuất giải pháp nếu có vẻ như tôi không thể. Tôi muốn chạy stat(<file>)trên nhiều thứ khác nhau để đảm bảo các quyền phù hợp với các quyền của quá trình đang chạy (tôi đang sử dụng php-fpm nên nó thay đổi tùy thuộc vào nhóm).
Giải pháp dựa trên posix mà Mario đưa ra ở trên, có vẻ hoàn hảo, tuy nhiên có vẻ như phần mở rộng posix đã - bị vô hiệu hóa nên tôi không thể thực hiện ở trên và vì tôi muốn so sánh kết quả với phản hồi từ chạy stat () đang chạywhoami trong một shell riêng biệt cũng không hữu ích (tôi cần uid và gid không phải tên người dùng).

Tuy nhiên, tôi đã tìm thấy một gợi ý hữu ích, tôi có thể stat(/proc/self)stat(/proc/self/attr) và xem uid và gid của tập tin.

Hy vọng điều đó sẽ giúp người khác


0

Bạn có thể sử dụng các lệnh sau:

<? system('whoami');?>

hoặc là

<? passthru('whoami');?>

hoặc là

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

hoặc là

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

hoặc là

<? print get_current_user();?>

get_current_user () không trả về người dùng hiện tại. Nó trả về chủ sở hữu của tập lệnh mà hàm được gọi.
xem

-1

Tôi thường sử dụng

<?php echo get_current_user(); ?>

Tôi sẽ rất vui nếu nó giúp được bạn


Điều này đã được đề cập trong các nhận xét dưới câu hỏi và nó chỉ liên quan rất ít đến người dùng mà tập lệnh đang chạy.
Palec

get_current_user() - Gets the name of the owner of the current PHP script- không phải người dùng đang chạy quy trình PHP.
Francisco Zarabozo

-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 

echo $_SERVER["USER"];hoạt động nhưng cung cấp tên người dùng đã đăng nhập hiện tại trong SSH.
Tarik

-1

Đề nghị

Có một chút muộn, nhưng mặc dù những điều sau đây là một công việc xung quanh, nó giải quyết được yêu cầu vì điều này hoạt động tốt:

<?
    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
?>


Sự miêu tả

Mã tô sáng ở trên không chính xác, vui lòng sao chép và dán vào trình soạn thảo yêu thích của bạn và xem dưới dạng mã PHP, hoặc tự lưu và kiểm tra.

Như bạn có thể biết, get_current_user() trả về chủ sở hữu của "tập lệnh đang chạy hiện tại" - vì vậy nếu bạn không "cắt" một tập lệnh trên máy chủ cho người dùng web-server thì nó có thể sẽ là "không ai cả", hoặc nếu nhà phát triển- người dùng tồn tại trên cùng một hệ điều hành, nó sẽ hiển thị tên người dùng đó.

Để giải quyết vấn đề này, chúng tôi tạo một tệp với quy trình đang chạy hiện tại. Nếu bạn chỉ require()điều này vào tập lệnh đang chạy hiện tại, nó sẽ trả về giống như tập lệnh mẹ như đã đề cập; vì vậy, chúng tôi cần chạy nó như một yêu cầu riêng để có hiệu lực.

Quy trình công nghệ

Để làm cho việc này hiệu quả, hãy xem xét việc chạy một mẫu thiết kế kết hợp "chế độ thời gian chạy", vì vậy khi máy chủ ở "chế độ phát triển hoặc chế độ kiểm tra" thì chỉ nó mới có thể chạy chức năng này và lưu đầu ra của nó ở đâu đó trong bao gồm , -hoặc chỉ là văn bản thuần túy hoặc cơ sở dữ liệu, hoặc tùy chọn nào.

Tất nhiên, bạn có thể thay đổi một số chi tiết của đoạn mã trên nếu bạn muốn để làm cho nó năng động hơn, nhưng logic là như sau:

  • xác định một tham chiếu duy nhất để hạn chế can thiệp với những người dùng khác
  • xác định đường dẫn tệp cục bộ để ghi tệp tạm thời
  • xác định một url / đường dẫn công khai để chạy tệp này trong quy trình của riêng nó
  • ghi tệp php tạm thời xuất ra tên chủ sở hữu tập lệnh
  • nhận đầu ra của tập lệnh này bằng cách đưa ra yêu cầu với nó
  • xóa tệp vì nó không còn cần thiết nữa - hoặc để lại nếu bạn muốn
  • trả về đầu ra của yêu cầu dưới dạng giá trị trả về của hàm

-1
<?php phpinfo(); ?>

lưu dưới dạng info.php và

mở info.php trong trình duyệt của bạn

ctrl + f rồi nhập bất kỳ cái nào sau đây:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

bạn có thể thấy người dùng và apache nhóm đang chạy như.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.