2012-09-28 28 views
10

का उपयोग कर विभिन्न उपयोगकर्ता पर स्विच करें मैंने हाल ही में रिमोट परिनियोजन के लिए कपड़े को देखना शुरू कर दिया है। मुझे एक diff उपयोगकर्ता (जिस से मैं लॉगिन करता हूं) पर स्विच करने की आवश्यकता है और इसे समझने में सक्षम नहीं हूं। क्या यह भी संभव है, अगर ऐसा है तो कैसे? मेरे वर्तमान उपयोगकर्ता में sudo अनुमतियां नहीं हैं।कपड़े

मैं निम्नलिखित वातावरण चर

env.sudo_prefix = "su newUser -c " 
env.sudo_prompt = "Password:" 

लेकिन कपड़े बदल रहा है 'NEWUSER' और विफल रहता है के लिए पासवर्ड इनपुट के लिए प्रतीक्षा नहीं करता है की कोशिश की।

out: Password: 
[[email protected]] out: su: incorrect password 

Fatal error: sudo() received nonzero return code 1 while executing! 

Requested: touch x 
Executed: su newUser -c -u "root" /bin/bash -l -c "cd /home/oldUser/upgrade && touch x" 

Aborting. 
Disconnecting from [email protected] done. 

अद्यतन:

रूप J.F. सेबेस्टियन का सुझाव दिया, su newUser -c काम करता है, लेकिन यह हर सर्वर है, जो एक तरह से स्वचालन के उद्देश्य धरा के लिए हर आदेश के लिए पासवर्ड संकेत देता है।

import getpass # just for demonstration 
from fabric.api import sudo, settings 

def su(user, command): 
    with settings(password=getpass.getpass('enter password for %s: ' % user), 
        sudo_prefix="su %s -c " % user, 
        sudo_prompt="Password:"): 
     sudo(command) 
+0

क्या आपने 'sudo ('su newuser')' – jfs

+0

हाँ की कोशिश की है, मैंने किया। समस्या यह है कि oldUser एक sudoer नहीं है, इसलिए कोई भी sudo कमांड के साथ विफल रहता है [आउट: oldUser sudoers फ़ाइल में नहीं है। इस घटना की सूचना दी जाएगी।] –

+0

क्या आप नए उपयोगकर्ता के रूप में एसएसएच कर सकते हैं? – jfs

उत्तर

11

धन्यवाद: वहाँ कपड़ा में किसी भी तरह से शीघ्र के आधार पर एक ही मूल्य में पारित करने के लिए (इस मामले में, अपने हमेशा Password:)

+0

'sudo_password' मेरे लिए काम करता है। –

7

आप newuser के रूप में ssh नहीं है और उपयोग नहीं कर सकते sudo(command, user='newuser') है J F Sebastian, कुछ कैच थे।

  1. कपड़ा lazily कनेक्शन बनाता है, तो मैं सु लागू संदर्भ स्विच से बचने के लिए पहले एक डमी कनेक्शन करना था।
  2. पीडब्ल्यूडी को वैश्विक दायरे में संग्रहीत करने की आवश्यकता है और ताकि इसका पुन: उपयोग किया जा सके। फैब्रिक इसे ओवरराइड सु कमांड के लिए कैश में नहीं डालता है।

यहाँ क्या कर समाप्त हो गया है। यह काम कर रहा है।

pwd = None 
@hosts('myhost.com') 
def test(): 
    with cd('/home/oldUser/upgrade'): 
     run('ls') #This is to connect aggressively (instead of lazily) 
     global pwd #Change the scope of pwd 
     if pwd is None: 
      pwd = getpass.getpass('enter password for newUser') 

     execute(su, pwd, 'newUser', 'touch x') 
     run ('ls') 
     execute(su, pwd, 'newUser', 'rm x') 
     run ('ls') 

def su(pwd, user, command): 
    with settings(
     password= "%s" % pwd, 
     sudo_prefix="su %s -c " % user, 
     sudo_prompt="Password:" 
     ): 
     sudo(command)