rsync pop_dir "/ home / user_x" falló: permiso denegado, ¿por qué?

Actualmente estoy escribiendo un script bash shell para transferir la última revisión de nuestro repository svn a un server web. Esto se hace usando svn export al server A y rsync'ing con el server web, se creó un usuario especial (llamado sync_user) con permissions suficientes en cada lado (server A y el server web) para realizar estas actualizaciones. El script utiliza "su sync_user" para realizar la export de svn y rsync como sync_user:

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

donde sync_section es una function en el script:

 # 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 todos los que tengan permissions para actualizar / sincronizar el server web conozcan la contraseña del usuario sync, por lo tanto, pueden ingresar a la sección "su sync_user".

Suena bien en teoría, pero rsync no está contento con esta configuration y me da el siguiente post de error: (user_x es el usuario que llama al script)

 #### 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 algunos googeling, descubrí que el problema que estoy teniendo es causado por rsync, ya que requiere que sync_user tenga permissions de acceso completos en el directory 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 directory de inicio del usuario no se usa en absoluto en el script. Solo / tmp / en el server A y / var / www / vhosts / en el server web se utilizan.

Muy bien, después de algunos vaivenes, logramos resolver el problema. Es completamente un tema de permiso de usuario y no tiene nada que ver con rsync como tal.

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

Para solucionarlo, agregué un 'cd ~' antes de ejecutar el script '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!