2010-11-12 8 views
5

किसी PHP स्क्रिप्ट को रूट अनुमतियों के साथ बैश स्क्रिप्ट निष्पादित करने की अनुमति कैसे दें?रूट अनुमतियों के साथ एक बैश स्क्रिप्ट निष्पादित करने के लिए PHP को अनुमति देना

मान लीजिए कि एक PHP स्क्रिप्ट है चलो ...

<?php 
// location: /var/www/script.php 
exec("bash /var/scripts/test.sh"); // "sudo bash ..." does not work 
?> 

और एक bash स्क्रिप्ट ...

#!/bin/bash 
# location: /var/scripts/test.sh 
sudo mkdir /test 
पाठ्यक्रम PHP और Apache के

रूट के रूप में नहीं भागना चाहिए और सबसे अच्छे रूप में केवल स्क्रिप्ट को रूट अनुमतियों के साथ निष्पादित किया जा सकता है। कोई विचार?

सादर, Jimbo

+4

रूट अनुमतियों के साथ चलाने के लिए आपको स्क्रिप्ट की आवश्यकता क्यों है? क्या आप उपयोगकर्ता द्वारा उपयोग किए जाने वाले संसाधनों को पठनीय (और यदि आवश्यक हो तो लिखने योग्य) तक बदल सकते हैं, तो वर्तमान में अपाचे वर्तमान में चल रहा है? – meagar

+0

नहीं। मैं एक 'गिट पुल' और कुछ 'ए 2 डीसाइट'/'ए 2साइट' निष्पादित करना चाहता हूं। – Jimbo

उत्तर

6

किसी भी पीएचपी आधारित समाधान है कि श्रृंखला के कुछ बिंदु पर जड़ अधिकार देता है खतरनाक है: पीएचपी उपयोगकर्ता के उपयोग के साथ एक हमलावर जड़ उपयोगकर्ता तक भी पहुंच सकता है, और वह यह है कि एक सुरक्षा बिंदु से अस्वीकार्य।

मैंने इसे कभी भी लागू नहीं किया है, लेकिन मैं सुझाव दूंगा कि मैंने here का सुझाव दिया है: रूट अधिकारों के साथ एक स्क्रिप्ट/क्रॉन नौकरी अक्सर PHP स्क्रिप्ट से एक संकेत के लिए कुछ स्थान स्कैन करें जो नौकरी की जानी है - के लिए उदाहरण, एक निश्चित नाम वाली फ़ाइल, या नौकरियों डेटाबेस में एक प्रविष्टि।

यदि वह फ़ाइल मौजूद है, तो मूल स्क्रिप्ट इसकी बात करती है, और फ़ाइल को फिर से हटा देती है।

यदि आपकी PHP स्क्रिप्ट को रूट स्क्रिप्ट से सीधी प्रतिक्रिया की आवश्यकता नहीं है, तो मुझे लगता है कि यह जाने का सबसे अच्छा तरीका होगा। (निश्चित रूप से फ़ाइल में एक स्टेटस संदेश लिखने वाली रूट स्क्रिप्ट द्वारा एक प्रतिक्रिया भी सुविधा दी जा सकती है)।

जब तक आप रूट स्क्रिप्ट के लिए PHP की किस प्रकार की नौकरियां लिख सकते हैं, यह एक वाटरटाइट समाधान है, क्योंकि यह रूट उपयोगकर्ता को PHP के व्यवसाय में नहीं मिलता है।

+0

मेरे पास इस समाधान को इस समय चल रहा है। मैं सोच रहा था कि क्या ऐसे समाधान हैं जो स्क्रिप्ट/क्रॉन्टाब चीज़ के रूप में सुरक्षित हैं लेकिन तेज़, अधिक कुशल और प्रत्यक्ष प्रतिक्रिया की अनुमति देते हैं। एक डोमिनोज़ मारने की तरह। – Jimbo

+0

@ जिम्बो - क्या आपका मतलब है कि खोल कमांड से php + apache तेज चल रहा है? या आप का मतलब अधिक सुविधाजनक है? – ajreal

+0

नहीं। मेरा मतलब है कि क्रॉन नौकरी शुरू होने तक प्रतीक्षा करने के समय के बिना। – Jimbo

1

आपको रूट के रूप में चलाने के लिए PHP या अपाचे की आवश्यकता नहीं हो सकती है। यदि आपके पास अपने सर्वर का नियंत्रण है तो आप suPHP नामक एक अपाचे मॉड्यूल का उपयोग करने में सक्षम हो सकते हैं और कॉन्फ़िगरेशन में अपनी PHP स्क्रिप्ट के लिए अपाचे को चलाने के लिए इच्छित उपयोगकर्ता निर्दिष्ट कर सकते हैं। आप इसे साइट के आधार पर साइट पर कर सकते हैं ताकि आपको किसी विशेष डोमेन पर स्क्रिप्ट के लिए केवल suPHP चलाने की आवश्यकता हो। मुझे यह सलाह देने के लिए विशेषज्ञता की कमी है कि इसे कैसे इंस्टॉल किया जाए, लेकिन मेरे पास समर्पित सर्वर कंपनी मेरे लिए यह कर रही थी कि वह मेरे सर्वर पर किसी भी लिथ को ट्रिगर करने के लिए एक गिटब पोस्ट-प्राप्त हुक को अनुमति दे ताकि किसी भी सर्वर को किसी सर्वर को खींच सकें समय कोई github repos को धक्का देता है। मैं इसे किसी अन्य तरीके से काम करने में असमर्थ था क्योंकि अपाचे को स्थानीय रिपो के मालिक के रूप में काम करने की आवश्यकता है।

मैंने अभी अन्य टिप्पणियों के आधार पर एक और संभावित समाधान के बारे में सोचा - आप github हुक से अनुरोध प्राप्त करने के लिए एक सरल PHP स्क्रिप्ट लिखने में सक्षम हो सकते हैं और 777 के साथ निर्देशिका में किसी फ़ाइल में कुछ मनमानी जानकारी लिख सकते हैं अनुमतियां या डीबी के लिए। फिर एक क्रॉन जॉब है जो यह देखने के लिए हर मिनट उस फ़ाइल या डीबी की जांच करता है कि यह बदल गया है और यदि ऐसा है, तो गिट पुल अनुरोध सीधे जारी करें क्योंकि क्रॉन आमतौर पर पहले से ही रूट के रूप में चलता है। आप यह भी देख सकते हैं कि फ़ाइल का टाइमस्टैम्प यह निर्धारित करने के लिए बदल गया है कि गिट पुल करना है या नहीं। आप अपने क्रॉन स्क्रिप्ट सु को जो भी उपयोगकर्ता के पास रिपोज़ के स्वामित्व में रख सकते हैं और फिर गिट खींच सकते हैं। एक वास्तविक रीयलटाइम समाधान नहीं है, लेकिन यदि क्रॉन स्क्रिप्ट बहुत सरल है तो यह वास्तव में आपके सिस्टम को हर मिनट या दो बार कॉल करने के लिए नहीं दबाएगा। उम्मीद है की वो मदद करदे।

6

यदि क्रॉन के लिए इंतजार नहीं करना चाहते हैं, तो यहां सी में एक साधारण रैपर है, जिसे आप php से कॉल करेंगे।

#include <unistd.h> 
#include <errno.h> 
#define WEBUID 500 
main(int argc, char ** argv, char ** envp) { 
    if(getuid() != WEBUID) exit(1); 
    /* some more security checks */ 
    if(setuid(geteuid())) perror("setuid error"); 
    envp = 0; /* don't want environment - security problem */ 
    system("/hardcoded/path/to/script.bash", argv, envp); 
} 

यह संकलित रैपर रूट, समूह "www" के स्वामित्व में होना चाहिए और "एस-बिट" होना चाहिए।
chwon root.www wrapper; chmod 4440 wrapper, तो

  • जब निष्पादित किया जाता है उसकी प्रभावी यूआईडी जड़ हो जाएगा
  • निष्पादित यह कर सकते हैं केवल समूह www (वेब ​​सर्वर के समूह)
  • और जब फोन करने वाले की यूआईडी एक वेब नहीं है सर्वर
+0

एक इलाज करता है! बॉक्स के बाहर क्या सोच रहा है, धन्यवाद। – georgiecasey

2

आपको incron (फ़ाइल सिस्टम घटनाओं के लिए क्रॉन) पर एक नज़र डालने की आवश्यकता है। फ़ाइल को php लिखें और लिखित फ़ाइल को बंद करने पर अपनी स्क्रिप्ट लॉन्च करने के लिए incron सेट करें (incron बहुत विशिष्ट है)। आपकी स्क्रिप्ट को कोड इंजेक्शन को रोकने और एकाधिक वेब उपयोगकर्ताओं के बीच किसी भी दौड़ की स्थिति को रोकने के लिए लॉकफ़ाइल कमांड का उपयोग करने के लिए इनपुट फ़ाइल को भी स्वच्छ करना चाहिए।

मेरे पास एक मिनी-वेब इंटरफ़ेस है जहां कोई पासवर्ड के साथ 1 घंटे के लिए अज्ञात एफ़टीपी या अन्य सेवाओं को चालू कर सकता है। www सामान्य निजीकरण के साथ चलता है जैसे www-data (php उपयोगकर्ता) लेकिन incron इनपुट हैंडलिंग स्क्रिप्ट को रूट के रूप में कॉल करता है।

माइक

0

एक डेमॉन रूट के रूप में चल रहा है (शायद सी में लिखे) है, जो आप के लिए शेल स्क्रिप्ट शुरू होता है का उपयोग करें। PHP स्क्रिप्ट के भीतर से शैल स्क्रिप्ट निष्पादन को ट्रिगर करने के लिए बस आईपीसी (संदेश कतार) का उपयोग करें।

यहाँ एक नज़र में एक विचार है कि मैं क्या बात कर रहा हूँ प्राप्त करने के लिए: http://php.net/manual/en/function.msg-send.php#114831

0

मैं हाल ही में एक परियोजना है कि पीएचपी प्राप्त करने और (यदि अनुरोध रूट के रूप में) एक असली बैश खोल के साथ बातचीत करने की अनुमति देता है प्रकाशित, यह हल करती है exec() और shell_exec() की सीमाएं। आप बस निम्नलिखित कोड का प्रयोग करेंगे डाउनलोड करने के बाद https://github.com/merlinthemagic/MTS

: यहाँ यह जाओ

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 
$return1 = $shell->exeCmd('/my/bash/script.sh'); 
//the return will be a string containing the return of the command 
echo $return1; 

सुरक्षा के संदर्भ में यह अब तक रूट के रूप में Apache चलाने से बेहतर है। लेकिन रूट को कहीं भी रूट देने देना हमेशा मुश्किल होता है।

1) आप sudo अजगर का अधिकार एपाचे अनुमति देते हैं:

परियोजना मैं बनाया 2 तरीकों में से एक में एक रूट बैश खोल प्राप्त होता है।

या

2) आप हर बार जब आप जड़ सेटअप के साथ एक खोल की जरूरत वस्तु को जड़ साख गुजरती हैं।

अपना जहर उठाओ। :) दस्तावेज पढ़ें।

संबंधित मुद्दे