2012-09-28 16 views
10

Recientemente comencé a buscar en tela para el despliegue remoto. Necesito cambiar a un usuario de diff (del que inicio sesión como) y no ser capaz de resolverlo. ¿Es posible, si es así cómo? Mi usuario actual no tiene permisos sudo.cambiar a otro usuario usando tela

He intentado cambiar siguientes variables de entorno

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

Pero tela no esperar a la entrada de la contraseña 'NewUser' y falla.

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. 

Actualización:

Como sugiere J. F. Sebastián, su newUser -c obras, pero se le solicita una contraseña para cada comando para cada servidor, que tipo de derrota el propósito de la automatización. ¿Hay alguna forma en la tela para pasar de igual valor en función de indicador (en este caso, siempre es Password:)

+0

has probado 'sudo ('su newuser')' – jfs

+0

sí, lo hice. El problema es que oldUser no es un sudoer, por lo que cualquier comando sudo falla con [out: oldUser no está en el archivo sudoers. Este incidente será reportado.] –

+0

¿podría usted ssh como nuevo usuario? – jfs

Respuesta

11

Gracias J F Sebastian, hubo un par de capturas.

  1. La tela hace las conexiones perezosamente, así que tuve que hacer una conexión ficticia antes de invocar su para evitar el cambio de contexto.
  2. Pwd deben almacenarse en el alcance global y para poder reutilizarlo. Fabric no lo pone en caché para el comando su reemplazado.

Esto es lo que terminó haciendo. Esta funcionando.

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' funciona para mí. –

7

Si no puede ssh como newuser y no se puede utilizar 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) 
Cuestiones relacionadas