2012-09-11 13 views
6

Actualmente estoy escribiendo un script bash shell para transferir la última revisión de nuestro repositorio svn a un servidor web. Esto se hace usando svn export al servidor A y rsync'ing con el servidor web, se creó un usuario especial (llamado sync_user) con permisos suficientes en cada lado (servidor A y el servidor web) para realizar estas actualizaciones. La secuencia de comandos utiliza "su sync_user" para llevar a cabo la exportación SVN y rsync como sync_user:rsync pop_dir "/ home/user_x" fallido: permiso denegado, ¿por qué?

export -f sync_section 
su sync_user -c "sync_section $source $tmp $dest" 

donde sync_section es una función de la secuencia de comandos:

# critical section which performs the actual website update (export & sync) 
# takes 3 parameters: source, tmp, dest 
function sync_section { 

    source=$1 
    tmp=$2 
    tmp_old=$tmp"_old" 
    dest=$3 

    #enter critical section 
    set -e 

    # export to temp folder on server A 
    svn export -q --force $source $tmp --native-eol LF 

    # rsync with remote live website folder. 
    rsync -avzhiO $tmp $dest 

    # clean up 
    rm -rf $tmp_old 
    mv -f $tmp $tmp_old 

    # exit critical section 
    set +e 
} 

La idea es que todo el mundo que tiene permisos para actualizar/sincronizar el servidor web conoce la contraseña del usuario sync, por lo tanto puede ingresar a la sección "su sync_user".

suena bien en teoría, pero rsync no es feliz con esta configuración y me da el siguiente mensaje de error: (user_x es el usuario que llama la secuencia de comandos)

#### rsync output: 

building file list ... rsync: pop_dir "/home/user_x" failed: Permission denied (13) 
rsync error: errors selecting input/output files, dirs (code 3) at flist.c(1314) [sender=2.6.8] 

Después de algún googeling descubrí que el problema que estoy teniendo es causada por rsync, ya que requiere que sync_user tenga permisos de acceso completo en el directorio de inicio del llamante del script. ¿Es eso correcto? y si es así ¿por qué? y hay una solución alternativa para ello?

Nota: El directorio de inicio del usuario no se utiliza en absoluto en el script. Solo/tmp/en el servidor A y/var/www/vhosts/en el servidor web se utilizan.

Respuesta

2

Bien, así que después de algunos vaivenes, logramos resolver el problema. Es un problema de permiso de usuario y no tiene nada que ver con rsync como tal.

Al ejecutar 'su sync_user ...', el terminal activo apunta al directorio de inicio del usuario que llama al script (user_x). Como sync_user ni siquiera está permitido en esa carpeta, no puede ejecutar algunos comandos (como rsync o ls), lo que provoca el mensaje de error.

Para solucionarlo he añadido un 'cd ~' antes de ejecutar el 'guión sync_section:

su sync_user -c "cd ~; sync_section $source $tmp $dest" 

Y el guión ahora funciona como un encanto :)

espero que esto ayude a alguien en el futuro !