मुझे यह पता लगाने की जरूरत है कि क्या php कोई नहीं है। मैं यह कैसे करु?
क्या "कोई नहीं" के लिए कोई अन्य नाम हैं? "अमरीका की एक मूल जनजाति"? अन्य कोई?
मुझे यह पता लगाने की जरूरत है कि क्या php कोई नहीं है। मैं यह कैसे करु?
क्या "कोई नहीं" के लिए कोई अन्य नाम हैं? "अमरीका की एक मूल जनजाति"? अन्य कोई?
जवाबों:
यदि उपलब्ध हो तो आप वर्तमान उपयोगकर्ता खाते की जांच कर सकते हैं posix_geteuid
और फिर उपयोगकर्ता नाम प्राप्त कर सकते हैं posix_getpwuid
।
$username = posix_getpwuid(posix_geteuid())['name'];
यदि आप सुरक्षित मोड में चल रहे हैं (जो कि अक्सर ऐसा होता है जब निष्पादन अक्षम हो जाता है), तो यह संभावना नहीं है कि आपकी PHP प्रक्रिया डिफ़ॉल्ट www-data
या apache
खाते के तहत कुछ भी चल रही हो ।
get_current_user()
मैनपेज है कि इस दृष्टिकोण से पता चलता है। PHP 5.4 के रूप में, इसे इसे छोटा किया जा सकता है:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
पिछड़े रास्ते की तरह, लेकिन निष्पादन / प्रणाली के बिना:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
यदि आप एक फ़ाइल बनाते हैं, तो स्वामी PHP उपयोगकर्ता होगा।
यह संभवतः किसी भी अस्थायी फ़ाइल फ़ंक्शन के साथ चलाया जा सकता है जैसे कि tempnam()
, जो अस्थायी निर्देशिका में एक यादृच्छिक फ़ाइल बनाता है और उस फ़ाइल का नाम देता है। यदि अनुमतियाँ, open_basedir
या सुरक्षित मोड जैसी किसी चीज़ के कारण समस्याएँ हैं, जो फ़ाइल लिखने से रोकती हैं, तो आमतौर पर, अस्थायी निर्देशिका की अनुमति दी जाएगी।
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
किसी भी सिस्टम पर अस्थायी निर्देशिका में एक अस्थायी फ़ाइल बनाएगा। फिर आप उस फ़ाइल का उपयोग उपयोगकर्ता / समूह प्राप्त करने के लिए कर सकते हैं। मुझे पता लगाने के लिए उपयोगकर्ता में से कुछ को छोड़ दिया।
अधिक विवरण उपयोगी होगा, लेकिन यह एक लिनक्स प्रणाली है, और यह मानते हुए कि php एपाचे के तहत चल रहा है, यह कभी भी उपयोगकर्ता के अपाचे के रूप में चलता है।
जाँच करने का एक आसान तरीका (फिर से, पर्यावरण की तरह कुछ यूनिक्स मानकर) इसके साथ एक php फ़ाइल बनाना है:
<?php
print shell_exec( 'whoami' );
?>
जो आपको उपयोगकर्ता देगा।
मेरे AWS उदाहरण के लिए, apache
जब मैं यह स्क्रिप्ट चलाता हूं तो मुझे आउटपुट के रूप में मिल रहा है।
आप इस तरह backticks का उपयोग करने की कोशिश कर सकते हैं:
echo `whoami`;
मै इस्तेमाल करूंगा:
lsof -i
lsof -i | less
lsof -i | grep :http
इनमें से कोई भी। आप अपनी 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 का उपयोग कर रहा हूँ ताकि यह पूल के आधार पर भिन्न हो)।
मारियो के ऊपर दिया गया पोज़िक्स आधारित समाधान, एकदम सही लगता है, हालाँकि ऐसा लगता है कि पॉज़िक्स का विस्तार है -डिज़ाइन किया हुआ है, इसलिए मैं ऊपर नहीं कर सका और जैसा कि मैं whoami
एक अलग शेल में चल रहे स्टेटिंग () रनिंग रिस्पॉन्स से परिणामों की तुलना करना चाहता हूँ या तो सहायक नहीं है (मुझे यूआईडी की जरूरत है और उपयोगकर्ता नाम नहीं है)।
हालांकि मैं एक उपयोगी संकेत मिल गया है, मैं कर सकता stat(/proc/self)
और stat(/proc/self/attr)
और यूआईडी देख सकते हैं और फ़ाइल के 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()
"चालू रनिंग स्क्रिप्ट" के मालिक को लौटाता है - इसलिए यदि आपने सर्वर पर वेब-सर्वर-उपयोगकर्ता के लिए एक स्क्रिप्ट को "चाउन" नहीं किया है, तो यह संभवतः "कोई नहीं" होगा, या यदि डेवलपर- उपयोगकर्ता एक ही OS पर मौजूद है, यह उस उपयोगकर्ता नाम को प्रदर्शित करेगा।
इसके चारों ओर काम करने के लिए, हम वर्तमान चल रही प्रक्रिया के साथ एक फ़ाइल बनाते हैं। यदि आप require()
इसे वर्तमान में चल रही स्क्रिप्ट में शामिल करते हैं, तो यह माता-पिता की स्क्रिप्ट के अनुसार ही वापस आएगा; इसलिए, हमें इसे प्रभावी करने के लिए एक अलग अनुरोध के रूप में चलाने की आवश्यकता है।
इसे प्रभावी बनाने के लिए, एक डिज़ाइन पैटर्न चलाने पर विचार करें जो "रनटाइम-मोड" को शामिल करता है, इसलिए जब सर्वर "विकास-मोड या परीक्षण-मोड" में होता है, तब केवल यह फ़ंक्शन चला सकता है और इसके आउटपुट को कहीं न कहीं शामिल कर सकता है। , और सिर्फ सादा पाठ या डेटाबेस, या जो भी हो।
बेशक आप ऊपर दिए गए कोड के कुछ विवरणों को बदल सकते हैं क्योंकि आप इसे और अधिक गतिशील बनाना चाहते हैं, लेकिन तर्क इस प्रकार है:
<?php phpinfo(); ?>
info.php और के रूप में सहेजें
अपने ब्राउज़र में जानकारी खोलें
ctrl + f फिर इनमें से कोई भी टाइप करें:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
आप उपयोगकर्ता को देख सकते हैं और समूह अपाचे के रूप में चल रहा है।
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
प्रमाणित उपयोगकर्ता