2012-07-24 14 views
12

मेरे पास एक शेल स्क्रिप्ट है जिसे कुछ कमांड चलाने के लिए गैर रूट उपयोगकर्ता खाते की आवश्यकता होती है और फिर शेष स्क्रिप्ट को चलाने के लिए उपयोगकर्ता को रूट में बदल दिया जाता है। मैं SUSE11 का उपयोग कर रहा हूँ। मैंने पासवर्ड प्रॉम्प्ट स्वचालित करने की अपेक्षा की है। लेकिन जब मैं स्पॉन su- का उपयोग करता हूं और आदेश निष्पादित हो जाता है, तो प्रॉम्प्ट रूट के साथ वापस आता है और शेष स्क्रिप्ट निष्पादित नहीं होती है।खोल स्क्रिप्ट के अंदर रूट उपयोगकर्ता में बदलना

ईजी।

< non-root commands> 
spawn su - 
<root commands> 

लेकिन सु के बाद - प्रॉम्प्ट उपयोगकर्ता के साथ रूट के रूप में वापस आ जाता है। स्क्रिप्ट के शेष को निष्पादित करने के लिए कैसे करें।

सूडो-एस विकल्प मदद नहीं करता है क्योंकि यह sudo -S ifconfig कमांड नहीं चलाता है जिसे मुझे मशीन का आईपी पता ढूंढने की आवश्यकता है।

मैं पहले से ही इन कड़ियों के माध्यम से चले गए हैं, लेकिन कोई समाधान नहीं मिल सकता है: पहले से Change script directory to user's homedir in a shell script

Changing unix user in a shell script

धन्यवाद

उत्तर

15

sudo यहाँ काम करेंगे, लेकिन आप आप स्क्रिप्ट एक छोटा सा बदलने की जरूरत है :

$ cat 1.sh 
id 
sudo -s <<EOF 
echo Now i am root 
id 
echo "yes!" 
EOF 

$ bash 1.sh 
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse) 
Now i am root 
uid=0(root) gid=0(root) groups=0(root) 
yes! 

आपको अपना सी चलाने की जरूरत है <<EOF ब्लॉक में ओमांड और ब्लॉक को sudo पर दें।

यदि आप चाहते हैं, तो आप su का उपयोग कर सकते हैं। लेकिन आपको इसे expect/pexpect का उपयोग करके चलाने की आवश्यकता है जो आपके लिए पासवर्ड दर्ज करेगा।

लेकिन फिर भी मामले आप पासवर्ड स्वचालित रूप से प्रवेश करने के लिए (या इसे बंद) का प्रबंधन कर सकता इस निर्माण कार्य नहीं करेगा:

user-command 
su 
root-command 

इस मामले root-command में, उपयोगकर्ता के साथ निष्पादित किया जाएगा रूट विशेषाधिकारों के साथ नहीं है, क्योंकि इसे su के बाद निष्पादित किया जाएगा (su एक नया खोल खोलता है, वर्तमान शेल के यूआईडी को नहीं बदला जाता है)। आप निश्चित रूप से यहाँ एक ही चाल का उपयोग कर सकते हैं:

su -c 'sh -s' <<EOF 
# list of root commands 
EOF 

लेकिन अब आप sudo साथ के रूप में ही है।

1

ऐसा करने का सबसे आसान तरीका कम से कम दो स्क्रिप्ट बनाना होगा।

पहले व्यक्ति को रूट विशेषाधिकारों के साथ दूसरे को कॉल करना चाहिए। तो दूसरी स्क्रिप्ट में निष्पादित हर आदेश को रूट के रूप में निष्पादित किया जाएगा।

उदाहरण के लिए:

runasroot.sh

sudo su-c'./scriptname.sh' 

SCRIPTNAME स्क्रिप्ट।sh

apt-get install mysql-server-5.5 

या जो भी आपको चाहिए।

+0

क्या होगा, रूट के बजाय, इसे $ USERNAME2 कहने दें? अग्रिम धन्यवाद। – raja777m

8

दूसरी स्क्रिप्ट के बिना इसे करने का एक आसान तरीका है। बस इसे अपनी फ़ाइल की शुरुआत में रखें:

if [ "$(whoami)" != "root" ] 
then 
    sudo su -s "$0" 
    exit 
fi 

फिर यह स्वचालित रूप से रूट के रूप में स्वयं को चलाएगा। बेशक, यह मानता है कि आप पासवर्ड प्रदान किए बिना sudo su कर सकते हैं - लेकिन यह इस उत्तर के दायरे से बाहर है; शेल स्क्रिप्ट में सूडो का उपयोग करने के बारे में अन्य प्रश्नों में से एक को देखें कि यह कैसे करें।

+0

सावधान रहें; '" $ 0 "' [ऐसा नहीं हो सकता है जो आपको लगता है] (http://mywiki.wooledge.org/BashFAQ/028)। – ELLIOTTCABLE

+1

@ELLIOTTCABLE यह दिलचस्प है, लेकिन मैं यह धारणा कर रहा हूं कि वर्तमान प्रक्रिया को शुरू करने के लिए $ 0 वर्तमान प्रक्रिया शुरू करने का आदेश है, इसलिए यह थोड़ा कम नाजुक है। फिर भी, एक अच्छा बिंदु, और बहुत उपयोगी लिंक। पासवर्ड प्रॉम्प्ट के लिए – Benubird

+0

बस 'echo $ PASSWORD का उपयोग करें। सुडो-एस सु-सी "$ 0" ' – Leathan

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