2009-09-02 12 views
5

में एक गिट रिपोजिटरी है जिसे सूडो के रूप में पोस्ट-प्राप्त हुक चलाने की आवश्यकता है।सेटयूड के साथ चलने वाला गिट 'पोस्ट-प्राप्त' हुक

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() { 
    int ret; 
    ret = setuid(geteuid()); 
    if(!ret) { 
     fprintf(stderr, "error setting uid %d \n", ret); 
    }  
    system("[...command only sudo can access...]"); 

    return 0; 
} 

geteuid()post-receive के मालिक आईडी प्राप्त करता है, तो setuid की कोशिश करता है: द्विआधारी है कि मैं इस परीक्षण करने के लिए तैयार की तरह दिखता है। किसी भी उपयोगकर्ता (सुपर उपयोगकर्ता सहित) के साथ इसे चलाने पर यह स्क्रिप्ट को रूट के रूप में सही ढंग से चलाता है। हालांकि, जब गिट हुक द्वारा ट्रिगर किया जाता है तो सिस्टम यूआईडी सेट करने में विफल रहता है। मैंने chmod u+s post-receive चलाने का प्रयास किया है मैंने कुछ अन्य कॉन्फ़िगरेशन भी आजमाए हैं, लेकिन मैं विचारों से बाहर हूं। किसी भी कारण से यह सभी मामलों में क्यों काम करेगा जब सिट इसे ट्रिगर करता है?

btw

, मंच उबंटू सर्वर 9.04 (2.6.28-15), git1.6.0.4, जीसीसी संस्करण 4.3.3 (उबंटू 4.3.3-5ubuntu4)

+0

क्या आपने कभी यह पता लगाया है? – Ibrahim

+0

एक मुद्दा यह है कि आप एक त्रुटि संदेश मुद्रित करते हैं लेकिन फिर सिस्टम() कॉल निष्पादित करना जारी रखते हैं। आप सिस्टम() कॉल के परिणाम को अनदेखा करते हैं और फिर सफलता (0) स्थिति से बाहर निकलें। –

+0

@ ब्लेक: "-स- किसी भी उपयोगकर्ता के साथ" बिट अस्पष्ट है - क्या उपयोगकर्ता उस उपयोगकर्ता के रूप में चलने पर सही ढंग से चलता है जब आप इसे दबा रहे हैं? मुझे लगता है कि यह गिट द्वारा चलाए जा रहे पर्यावरण को डुप्लिकेट करने का सबसे नज़दीकी तरीका होगा: 'ssh hostname 'cd/path/to/repo; .git/hooks/post-rece'' – Cascabel

उत्तर

0

कमांड प्रॉम्प्ट

से अपने कार्यक्रम चलाने की कोशिश करें
+0

गिट के माध्यम से सक्रिय नहीं होने पर ठीक काम करता है। –

1
  1. फाइल सिस्टम जहां Git रेपो nosuid विकल्प
  2. आप SSH पर जोर दे रहे हैं, तो SUID क्षमता ssh (कोई CAP_SETUID)
के साथ आमंत्रण आदेश के लिए निष्क्रिय किया जा सकता के साथ स्थापित किया जा सकता है संग्रहीत किया जाता है 0

किसी भी मामले में, आप जो करने की कोशिश कर रहे हैं वह बहुत ही अचूक है।

1
  1. अपने प्रोग्राम को डिमन के रूप में चलाएं।
  2. सॉकेट/नामित पाइप/msgq पर इनपुट के लिए प्रतीक्षा करें।
  3. हुक में, ऑपरेशन करने के लिए आवश्यक जानकारी के साथ अपने डिमन को एक संदेश भेजें।
  4. यदि आवश्यक हो, तो स्थिति के साथ हुक पर एक संदेश भेजें।

यह संभवतः प्रबंधित और सुरक्षित रूप से सुरक्षित होना आसान होगा।

0

बूटस्ट्रैप स्क्रिप्ट लिखने का प्रयास करें। यानी

#/usr/bin/sh 
./your_program 

फिर स्क्रिप्ट को हुक बनाएं।

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