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