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?
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?
Câu trả lời:
Nếu có, bạn có thể thăm dò tài khoản người dùng hiện tại posix_geteuid
và 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-data
hoặc apache
tài khoản mặc định .
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'];
<?php echo exec('whoami'); ?>
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_basedir
hoặ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.
$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.
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.
Bạn có thể thử sử dụng các que tính ngược như thế này:
echo `whoami`;
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_
grep "APACHE_RUN_" /etc/apache2/envvars
hoạt động tốt, cảm ơn.
exec('whoami')
sẽ làm điều này
<?php
echo exec('whoami');
?>
Ngay từ vỏ bạn có thể chạy:
php -r "echo exec('whoami');"
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!
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)
và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
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();?>
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
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.
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
?>
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.
Để 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:
<?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ư.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Người dùng đã được chứng thực