2009-02-24 12 views
16

का उपयोग करके एक सुपरसियर के रूप में एक लिनक्स सिस्टम कमांड चलाएं, मुझे अपनी मशीन पर पोस्टफिक्स इंस्टॉल किया गया है और मैं फ्लाई प्रोग्रामेटिकली (पायथन का उपयोग करके) पर वर्चुअल_लीअस अपडेट कर रहा हूं (कुछ क्रियाओं पर)। एक बार मैं में प्रवेश अद्यतन/etc/पोस्टफ़िक्स/virtual_alias, मैं कमांड चला रहा हूँ: एक पाइथन स्क्रिप्ट

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
लेकिन मैं त्रुटि हो रही है:
sudo: sorry, you must have a tty to run sudo

मैं एक गैर मानव तरह से उल्लेख किया sudo आदेश चलाना चाहते हैं (अर्थात, मैं एक पाइथन लिपि से इस सिस्टम कमांड चला रहा हूँ।)। तो मैं इस आदेश को प्रोग्रामेटिक रूप से कैसे चला सकता हूं?

उत्तर

19

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

या आप /etc/init.d/postfix के लिए पासवर्ड की आवश्यकता नहीं है, तो आप सूडो को कॉन्फ़िगर कर सकते हैं।

सूडो कॉन्फ़िगरेशन (विज़ुडो के माध्यम से) NOPASSWD को अनुमति देता है: बिना पासवर्ड के कमांड को अनुमति दें। देखें http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username> ALL = NOPASSWD: /etc/init.d/postfix 

या कुछ इसी तरह के।

+0

+1: पाइथन लिपि के बाहर सूडो करें। –

+0

डगलस! मैं उस स्क्रिप्ट (/etc/init.d/postfix रीलोड) पर पासवर्ड की आवश्यकता नहीं होने के लिए सूडो को कैसे कॉन्फ़िगर कर सकता हूं? –

+0

सुडो को पास करने की ज़रूरत नहीं है, सडोर्स का विषय है, और प्रोग्रामिंग प्रश्न के दायरे से बाहर, प्रति उपयोगकर्ता प्रति कार्यक्रम कॉन्फ़िगर किया जा सकता है। – myroslav

2
import os 
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword") 

यह निश्चित रूप से हमेशा एक अच्छा विचार नहीं है क्योंकि पासवर्ड सादा पाठ में है।

+2

सादे टेक्स्ट में एक सुडो पासवर्ड एक गंभीर विचार है, और अधिक सुरक्षित तरीके हैं। सेटयूड बिट विशेष रूप से इस चिंता को संबोधित करता है। – codelogic

+0

सादा पाठ पासवर्ड? Eeek! उपयोगकर्ता या समूह के लिए/etc/sudoers में NOPASSWD सेट करें, इसलिए सुडो को कोई पासवर्ड प्रदान करने की आवश्यकता नहीं होगी। –

+0

यदि आप अपने निजी कंप्यूटर पर त्वरित और गंदे समाधान चाहते हैं तो यह इतना बुरा विचार नहीं है। यह उत्पादन वातावरण में बस खराब है। – answerSeeker

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

// gcc -o reload_postfix reload_postfix.c 
// chown root reload_postfix 
// chmod +s reload_postfix 

int main(int argc, char **argv) { 
    setuid(geteuid()); 
    system("/etc/init.d/postifx reload"); 
} 

setuid-ed प्रोग्राम में अपना आदेश लपेटें। यह किसी भी उपयोगकर्ता को पोस्टफिक्स को पुनरारंभ करने देगा। आप निश्चित रूप से कुछ समूहों को निष्पादन अनुमति को प्रतिबंधित कर सकते हैं।

+0

मैं अजगर लिपि के बारे में बात कर रहा था! –

+0

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

+0

सूडो को रूट विशेषाधिकार प्राप्त करने का बेहतर तरीका माना जाता है। यह फाइल सिस्टम में सेट्यूड बिट्स को स्कैटरिंग के विचार को बदलता है जो केंद्रीय कॉन्फ़िगरेशन के साथ उस कार्यक्षमता (सुडो) में सक्षम एकल निष्पादन योग्य है, ऑडिट-सक्षम उपयोग के साथ अधिक लचीली नीतियां। – myroslav

3

त्रुटि का जवाब देने के लिए: "सुडो: क्षमा करें, आपके पास सुडो चलाने के लिए एक टीटी होना चाहिए", हमारे पास सूडोर्स फ़ाइल में "डिफ़ॉल्ट आवश्यकताएं" नामक एक सेटिंग है। मैंने इसे टिप्पणी करने की कोशिश की और यह काम किया: डी।

+0

दूसरी तरफ ज़रूरतमंद के सामने विस्मयादिबोधक चिह्न छड़ी करना है "डिफ़ॉल्ट! आवश्यकता"। इस तरह सुडॉयर फ़ाइल पढ़ने वाला कोई भी व्यक्ति देख सकता है कि आप स्पष्ट रूप से बिना किसी टीटी के सूडो को अनुमति दे रहे हैं –

0

यदि आप करने वाले हैं अजगर में यह कर आप बस अनुसरण करना चाहिए:

लिखने लाइन है कि आप शेल कमांड

os.setuid(os.geteuid()) 

तो फोन करने से पहले इस आदेश, आप शेल कमांड फोन बिना "सुडो" उपसर्ग

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