def make_command(
    command,
    env=None,
    su_user=None,
    sudo=False,
    sudo_user=None,
    preserve_sudo_env=False,
):
    '''
    Builds a shell command with various kwargs.
    '''

    debug_meta = {}

    for key, value in (
        ('sudo', sudo),
        ('sudo_user', sudo_user),
        ('su_user', su_user),
        ('env', env),
    ):
        if value:
            debug_meta[key] = value

    logger.debug('Building command ({0}): {1}'.format(' '.join(
        '{0}: {1}'.format(key, value)
        for key, value in six.iteritems(debug_meta)
    ), command))

    # Use env & build our actual command
    if env:
        env_string = ' '.join([
            '{0}={1}'.format(key, value)
            for key, value in six.iteritems(env)
        ])
        command = 'export {0}; {1}'.format(env_string, command)

    # Quote the command as a string
    command = shlex_quote(command)

    # Switch user with su
    if su_user:
        command = 'su {0} -c {1}'.format(su_user, command)

    # Otherwise just sh wrap the command
    else:
        command = 'sh -c {0}'.format(command)

    # Use sudo (w/user?)
    if sudo:
        sudo_bits = ['sudo', '-H']

        if preserve_sudo_env:
            sudo_bits.append('-E')

        if sudo_user:
            sudo_bits.extend(('-u', sudo_user))

        command = '{0} {1}'.format(' '.join(sudo_bits), command)

    return command
def make_command ( command , env = None , su_user = None , sudo = False , sudo_user = None , preserve_sudo_env = False , ) : debug_meta = { } for key , value in ( ( 'sudo' , sudo ) , ( 'sudo_user' , sudo_user ) , ( 'su_user' , su_user ) , ( 'env' , env ) , ) : if value : debug_meta [ key ] = value logger . debug ( 'Building command ({0}): {1}' . format ( ' ' . join ( '{0}: {1}' . format ( key , value ) for key , value in six . iteritems ( debug_meta ) ) , command ) ) if env : env_string = ' ' . join ( [ '{0}={1}' . format ( key , value ) for key , value in six . iteritems ( env ) ] ) command = 'export {0}; {1}' . format ( env_string , command ) command = shlex_quote ( command ) if su_user : command = 'su {0} -c {1}' . format ( su_user , command ) else : command = 'sh -c {0}' . format ( command ) if sudo : sudo_bits = [ 'sudo' , '-H' ] if preserve_sudo_env : sudo_bits . append ( '-E' ) if sudo_user : sudo_bits . extend ( ( '-u' , sudo_user ) ) command = '{0} {1}' . format ( ' ' . join ( sudo_bits ) , command ) return command
Builds a shell command with various kwargs.