09 septiembre 2010

Script para ejecutar chown sólo en ficheros con un uid determinado

Hace unos días me llegó una petición de  uno de nuestros clientes. Quería poder ejecutar chown sin ser root sobre determinados ficheros. La particularidad de la petición es que si no eres root, sólo puedes cambiar de propietario tus ficheros.

Pensamos en solucionarlo configurando sudo de modo que el usuario pudiera utilizar chown, pero no tuvimos que darle ni una vuelta para darnos cuenta de que era una opción demasiado peligrosa, ya que de esa manera, el usuario podría cambiar el propietario de cualquier fichero.

Ahora sí comenzamos a darle unas vueltas  y finalmente escribimos un script. El script es muy sencillo, existe un array con la lista de usuarios a los que puede pertenecer el fichero o ficheros a modificar, es decir, si tengo el usuario "pepe", el usuario "manolo", y el usuario "perico" y sólo quiero poder ejecutar chown para ficheros que pertenecen a "pepe" y a "manolo", son estos dos usuarios los que tengo que incluir en el array.

La sintaxis es como la de chown, pero con el nombre del script, y si además está en sudoers será:

#sudo mchown usuario fichero
No es que sea la octava maravilla del mundo, pero cumple su función .

El script en cuestión es éste:



#/bin/bash

##########################################################################
# Shellscript:  mchown - cambia el propietario de un fichero o ficheros
# Date       :  2010-9-9
# Categoria   : Utilidades de ficheros
##########################################################################


PN=`basename "$0"`                      # Nombre del programa
VER='1.0'

Uso () {
    echo >&2 "$PN  Cambia los permisos de ficheros con usuarios determinados
                  en el directorio actual, $VER

     Uso: $PN usuario [fichero...]

     Se puede dar el nombre de ficheros determinados o utilizar *. No es recursivo.
     "
     exit 1
}
# Comprobamos si existen los tres usuarios en el sistema

USUARIOS=( usuario1 usuario2 usuario3 usuario4)
i=0
while [ $i -lt 4 ]; do
   usr=`id -u ${USUARIOS[$i]} 2>/dev/null`
   case $? in
      0) USUID[$i]=$usr;
        indice=$i
      ;;
      *)
      ;;
   esac
   (( i=i+1 ))
done

[ $# -lt 1 ] && Uso

# Si nos dan PN,  usuario y fichero continuamos

nuevoprop=$1
while [ $# -gt 1 ] ; do
    for propiet in "${USUID[@]}"; # Iteramos sobre el array
    do
        fichero=`stat -c %u $2` # comprobamos el uid del fichero
        if [ $fichero == $propiet ]; # Validamos el uid del fichero
            then
            chown $nuevoprop $2
            unset fichero
        fi
     shift # movemos la posicion del parametro un lugar
    done

done


3 comentarios:

D3 dijo...

yo tengo un caso similar y creo que seria de mucha utilidad si alguien pudiera hacer un script asi. resulta que en la empresa un servidor de correos linux se hecho a perder y ya teniamos respaldo de las carpetas home y todo, resulta que son mas de 600 usuarios los uqe hay en linux y cada carpeta tiene como propietario a root, teniendo esto cuando quieren mandar un correo desde outlook marca errores de permisos porque cada carpeta deberia tener de propietario a su propio usuario.

el comando deberia ser chown -R $usuario:users /home/$usuario

de tal manera que el script tuviera la peculiaridad de tomar el nombre de cada carpeta y ponerle el mismo propietario. ya que poner el propietario a mas de 600 carpetas es tedioso.

si alguien lo hizo o tiene la solucion agradeceria mucho su comentario.

jmcalvar dijo...

Si eso lo ejecuta root es muy fácil de hacer, lo que pasa es que estoy escribiendo con el movil, pero si no lo tienes, luego te lo escribo

jmcalvar dijo...

Mira, sería tan fácil como hacer algo así:


#!/bin/bash

for usuario in `ls /home/`; do
chown -R ${usuario}:users /home/${usuario}
done