Skip to Content

Script para asignar propiedad y permisos a los ficheros de un sitio DRUPAL

Hola...

Tras una "larga" y estimulante investigación sobre el tema de los permisos para los ficheros y directorios de una instalación DRUPAL, hoy publico la segunda versión de mi scrip.

Está mal que yo lo diga, pero se trata de un script modélico (en el sentido que utiliza las reglas clásicas del lenguaje bash ;-)

Se admiten criticas razonadas ...

Que lo disfrutéis.



#!/bin/bash
#
# script: D_arregla.sh
#
# Asignación de la propiedad y los permisos de una instalación DRUPAL (verificado para D5, D6 y D7)
# Versión 1.1 (2-8-2009) - Versión inicial.
# Versión 2.1 (12-7-2011) - Adaptación a las recomendaciones de http://drupal.org/node/244924
#
# Autor: isaac.el.cec@gmail.com -
# (cc) Licencia CC BY-NC-CA (http://es.creativecommons.org/licencia/)
#
# Uso: ver "HELP" mas abajo...
#
# IMPORTANTE: Antes de ejecutar este escript es necesario asignar un valor correcto a la variable PROPIETARIO
###################################################################################################
# DATOS INICIALES (recomendación de: http://drupal.org/node/244924 )
# - Propietario y grupo
PROPIETARIO="XXXXXXX" # Ha de ser un usuario del sistema
GRUPO="www-data" # Ha de ser = al propietario del proceso APACHE.

# - Permisos de ficheros y directorios (en general y para los que esten bajo directorios "files")
P_FICHEROS="0640"
P_DIRECTORIOS="0750"
P_FICHEROS_FILES="0660"
P_DIRECTORIOS_FILES="2770"
# FIN de la asignación de los DATOS INICIALES (Modificar bajo propia responsabilidad)
#####################################################################################################

# Declaración de funciones internas
error ()
{
echo "########################################################################"
echo -e "ERROR: ${1}" ;
echo -e "${HELP}" ;
read -p "Pulsar INTRO para finalizar . . . " z ;
exit ${2}
};

# Asignación del directorio raíz...
if [ "${1}" = "" ]
then
DIR_DRUPAL="`pwd`";
else
DIR_DRUPAL=${1};
fi

HELP="\n D_arregla.sh - AYUDA:\n
Este scrip establece la propiedad y los permisos de ficheros y directorios
de una instalación DRUPAL (D5, D6 o D7) \n\n
Uso: [sudo] D_arregla.sh [camino_a_raíz_DRUPAL] \n\n
-- Notas:\n
---- Parámetro opcional. Si no hay parámetro, se asume que el directorio actual es la raíz del sitio DRUPAL \n
---- Valor actual de PROPIETARIO = [${PROPIETARIO}] \n
---- Valor actual de GRUPO = [${GRUPO}] (ha de ser el grupo del proceso APACHE) \n
---- Valor actual del camino a la raíz DRUPAL = [${DIR_DRUPAL}] \n\n "

#####################################################################
# Verificación de variables...
if [ -z "${PROPIETARIO}" ] || [ "`id -un ${PROPIETARIO} 2> /dev/null`" != "${PROPIETARIO}" ]; then
error "\n ERROR: Nombre de usuario del sistema no válido: ${PROPIETARIO} " 1 ;
fi

if [ -z "${GRUPO}" ] || [ "`id -gn ${GRUPO} 2> /dev/null`" != "${GRUPO}" ]; then
error "\n ERROR: Nombre de grupo del sistema no válido: ${GRUPO} " 2 ;
fi

if [ -z "${DIR_DRUPAL}" ] || [ ! -d "${DIR_DRUPAL}/sites" ] || [ ! -f "${DIR_DRUPAL}/modules/system/system.module" ]; then
error "\n ERROR: Camino a la raíz de DRUPAL no válido: ${DIR_DRUPAL} " 3 ;
fi

#####################################################################
# INICIO del PROCESO (propiamente dicho ;-):
tput clear

z="N" ;
until [ "${z}" = "S" ] || [ "${z}" = "s" ] ; do
echo "ATENCIÓN:" ;
echo "Directorio de trabajo (raiz DRUPAL): ${DIR_DRUPAL}";
read -p "Confirmar la ejecución del scrip con una [S,s] o cancelar con [CTRL-C]: " z ;
done

cd ${DIR_DRUPAL}

echo "- Asignando la propiedad y el grupo... (paciencia)"
chown -R ${PROPIETARIO}:${GRUPO} . ;
if [ "${?}" != "0" ] ; then
error "No puedo cambiar la propiedad de los ficheros... (ejecutar como administrador)" 4 ;
fi

echo "- Permisos de los ficheros... (+paciencia)"
find . -type f -exec chmod ${P_FICHEROS} '{}' \;
if [ "${?}" != "0" ] ; then
error "No ouedo cambiar los permisos de los ficheros... (ejecutar como administrador)" 5 ;
fi

echo "- Permisos de los directorios... (++paciencia)"
find . -type d -exec chmod ${P_DIRECTORIOS} '{}' \;

cd ${DIR_DRUPAL}/sites
echo "- Permisos de los directorios \"files\" bajo \"${path}/sites\" ... (++paciencia)"
find . -type d -name files -exec chmod ${P_DIRECTORIOS_FILES} '{}' \;

echo "- Permisos de los ficheros en directorios \"files\" ... (++paciencia)"
find . -type d -name files -exec find '{}' -type f \; | while read FILE; do chmod ${P_FICHEROS_FILES} "$FILE"; done

echo "- Permisos de los directorios bajo directorios \"files\" ... (++paciencia)"
find . -type d -name files -exec find '{}' -type d \; | while read DIR; do chmod ${P_DIRECTORIOS_FILES} "$DIR"; done

# CASOS ESPECIALES - Permisos fijos...
echo "- Permisos de los casos especiales: fichero \"settings.php\" y directorio \"default\"..."
cd ${DIR_DRUPAL}
# Caso especial: fichero [settings.php] !!!
find . -name "settings.php" -exec chmod 440 '{}' \;
# Caso especial: directorio [sites/default/] !!!
find . -type d -name "default" -exec chmod 550 '{}' \;
# Caso especial: directorios [tmp] repartidos por cualquier sitio (vete tu a saber...)!!!
find . -type d -name "tmp" -exec chmod ${P_DIRECTORIOS_FILES} '{}' \;

echo -e "\n\n\n PROCESO FINALIZADO."
read -p "Pulse INTRO para finalizar ... " z ;
exit 0
#####################################################################

Comentaris

Error en unas comillas dobles...

Nadie me ha indicado que havia un error en una sentencia "echo" (ya está correigido). Será que nadie lo ha ejecutado...
Yo lo hago muy a menudo (administrar + de 10 sitios tiene estas cosas)
Saludos
isaac.el.cec

Más

Más info:

http://www.lullabot.com/articles/keeping-drupals-files-safe

Por cierto, si añades la info de autoría de los comentarios igual te comenta alguien más ;)

Respondiendo a un anónimo (involuntario)

Hola apreciado "anónimo"...

Primero lo último ;-)
Aunque no exista el campo "Autor", siempre puedes firmar tus comentarios... dentro del propio comentario, como he hecho yo en el comentario anterior al tuyo.

Y ahora el tema de los permisos:
- La configuración que se presenta en el articulo que propones, básicamente se trata de que los ficheros sean propiedad de un usuario ("jaime" por ejemplo) y del grupo propietario del proceso Apache ("www-data" en Debian / Ubuntu) -hasta aquí es la misma solución que he implementado yo en el script-
- Como aportación diferencial del artículo (y que me apresuro a introducir en mi script) es el tema de los permisos a los directorios bajo "sites/default/files": se trata de dar permisos "2770" (y no "2777" como dice el artículo) para conseguir que cualquier nuevo fichero o directorio creado se asigne al grupo "www-data".

Nota: el "2" en los permisos es el llamado "modo setuid"

Saludos (y gracias "anónimo" . . .)
Isaac.el.cec (alias Jaime !!!)

De nada!

Fdo. Anónimo ;)).

Powered by Drupal, an open source content management system