viernes, 10 de octubre de 2014

Recuperando permisos de / en linux

Hola,
hoy en la nueva sección "la cagué" (xDDD)..... na enserio, supongamos que por algún motivo se nos fue el chmod 777 -R / y peor aun como root D: creo que quienes lo hemos hecho sabemos los problemas que nos dará el sistema si no inmediatamente, si cuando reiniciemos.
Pues bien en este articulo espero dar al menos una pequeña opción de como podríamos recuperar dichos permisos si no del todo correctos al menos que nos deje funcionales para correr los servicios fundamentales temporalmente mientras vamos echando mano a lo que aun queda con secuelas (jejej).
Dejo una imagen de la cual me referiré el resto del articulo:
Ejemplo de uso con carpetas de prueba
Ejemplo de uso con carpetas de prueba (en rojo los pasos enumerados)
root1: Máquina "sana" o sea con los permisos por default o como vienen del sistema.
root2: Máquina que afectamos con el chmod
Comandos que usaremos:
¡¡¡...Recuerden, todo como ROOT...!!!
find: Como sabrán es un binario para hacer búsquedas en nuestro sistema (para mayor informacion `man find`)
xargs: Con este binario podemos construir y ejecutar un comando que provenga de un standar input por ejemplo un pipe ( | ) [jejejej ese paréntesis parece una vag-i-n-a  xDDD].
ssh: Este solo para el caso de ssh ;) y ya sabes es el cliente para conectarse por ssh a algun servidor del mismo.
Bien planteemos el problema supongamos que en un PC corrimos ese comando (ente caso en "root2") y necesitamos recuperar ese "daño". Para esto vamos a necesitar de otro sistema de la misma distribución preferiblemente y podremos ejecutarlo bajo las siguientes opciones:
  1. Si no hemos reiniciado el sistema ejecutamos el cambio de permisos por SSH claro si es que tenemos el servicio iniciado y con acceso root (a veces no pero si es un sistema de casa de seguro nadie le quito el acceso al root)
  2. Ejecutar la distro que usamos con el live cd (aunque la mayoría ya casi no tiene esta seria una buena opción para ubuntus y derivados)
  3. Generar un archivo de texto con todos los permisos desde: ya sea el live cd u otra maquina con una distribución igual/similar a la de la maquina en que la cagamos ("root2")
Bien entonces a la carga:

1. Por SSH

Vale esta opción es la mejor si por alguna razón el implicado es un servidor D:... pues los comandos son los siguientes:
desde nuestra maquina sana ("root1") ejecutamos lo siguiente teniendo en cuenta que es una distribución similar o igual y esta lo mas "limpia" posible, igual no hay problema si tenemos mas ficheros simplemente dará un no encontrado en el root2 y listo jejej:
find / -print0 | xargs -0 stat -c "chmod %a '%n';" | ssh root@1.2.3.4
recordar cambiar 1.2.3.4 por la IP del servidor (root2 o PC que esta cagado xD)

2. Desde Live CD

Bueno si no podemos conectarnos al SSH por cualquier motivo pero tenemos el Live CD pues iniciamos la maquina con el Live CD y montamos la partición del sistema dañado (supongamos que la montamos en /mnt/ ) y ejecutamos el casi mismo comando pero con este pequeño cambio:
cd /
eval $(find . -print0 | xargs -0 stat -c "chmod %a '/mnt/%n';")
En este caso nos ubicamos en la raíz y se ejecuta el find sobre . para que la salida sea desde ./ y asi no nos moleste mucho en el mount ya que quedaría algo asi: /mnt/./etc/*** ... bueno y le agregamos antes del %n del stat para que se ubique en esa carpeta. Este ejemplo es el mas parecido al de la imagen.

3. Por archivo generado

Y ya si ninguna de las anteriores nos sirve por cualquier motivo pues siempre podemos generar el archivo con los permisos de la maquina sana o root1 y luego transportarnos a la maquina afectada o root2. Con los siguientes comandos:
en la maquina root1:
find / -print0 | xargs -0 stat -c "chmod %a '%n';" >> /media/pendrive/Permisos.txt
y esto te generaría un archivo con muchas lineas en formato permisos en octal y ruta de archivo/carpeta ejemplo 755 /var/www y asi con todos los archivos que encuentre. Luego transportamos ese archivo a nuestra maquina jodida de alguna forma ya la encontraras jejeje y ejecutarías lo siguiente:
en la maquina root2:
eval $(while read line; do echo "chmod $line;"; done < ./Permisos.txt)
y eso leerá el archivo y ejecutará el chmod sobre las lineas que encuentre en el archivo.
Y bueno no siendo mas, espero les ayude en algo sino totalmente al menos parcialmente para después de ello si arreglarlo. Si por algún motivo no puedes ninguna de las anteriores opciones solo queda reinstalar u.u. También podríamos regenerar usuario:grupo en caso de ser necesario con solo agregar al stat después del ; del chmod algo como:
chown %u:%g '%n';
Saludos kid_goth.

No hay comentarios:

Publicar un comentario en la entrada