2012-09-28 7 views
10

Recentemente ho iniziato a esaminare il fabric per la distribuzione remota. Ho bisogno di passare a un utente diff (da quello che accedo come) e non sono in grado di capirlo. E 'anche possibile, se sì, come? Il mio attuale utente non ha permessi sudo.passare a un altro utente utilizzando il fabric

Ho provato a cambiare seguenti variabili d'ambiente

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

Ma tessuto non aspettare per l'immissione della password per 'newUser' e non riesce.

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. 

Aggiornamento:

Come suggerito J.F. Sebastian, su newUser -c opere, ma richiede una password per ogni comando per ogni server, che tipo di sconfigge lo scopo di automazione. C'è un modo in tessuto per passare lo stesso valore sulla base di prompt (in questo caso, la sua sempre Password:)

+0

hai provato 'sudo ('su newuser')' – jfs

+0

sì, l'ho fatto. Il problema è che oldUser non è un sudoer, quindi qualsiasi comando sudo non riesce con [out: oldUser non è nel file sudoers. Questo incidente verrà segnalato.] –

+0

potresti ssh come nuovo utente? – jfs

risposta

11

Grazie J F Sebastian, ci sono stati un paio di catture.

  1. Il tessuto rende le connessioni pigramente, quindi ho dovuto fare una connessione fittizia prima di invocare su per evitare il cambio di contesto.
  2. Pwd deve essere archiviato in ambito globale e in modo che possa essere riutilizzato. Fabric non lo manda nella cache per il comando sovrascritto su.

Ecco cosa è finito. Sta funzionando.

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) 
+0

'sudo_password' funziona per me. –

7

Se non è possibile ssh come newuser e non è possibile utilizzare sudo(command, user='newuser'):

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)