Distribución de los permisos

Gestión de permisos en Linux con chmod

Introducción

En GNU/Linux todos los ficheros y directorios tiene un usuario y un grupo (a menos que lo cambies los del creador) y una serie de permisos asignados.

Existen 3 tipos de permisos:
– Lectura (R)
– Escritura (W)
– Ejecución (X)
*La letra que está entre paréntesis es la identifica al permiso

Y cada tipo de permiso se asigna a:
Usuario: Dueño del fichero
Grupo: Grupo al que pertenece el fichero
Otro: Otros usuarios que no pertenecen al mismo grupo
* La letra en negrita identifica el permiso

Sigue leyendo

Anuncios

Diferencia entre ruta relativa y absoluta

Para acceder a un fichero o carpeta (ya sea en Windows, Linux o Mac) utilizamos lo que se llama una ruta, una ruta es algo así como la dirección de una casa.

Hay dos tipos de rutas:
– Relativas
– Absolutas

La diferencia entre una ruta relativa y una absoluta radica en que la relativa depende del directorio en el que te encuentras actualmente, mientras que la absoluta no.

 

Pongamos un ejemplo, imagina que estás en un pueblo llamado Villa Bug, en la calle Null Pointer Exception N° 16 y quieres llegar a la calle Internal Error N° 32. Hay dos modos de llegar a esa dirección:

– Desde tu posición actual, girar la primera calle a la izquierda y luego a la derecha (ruta relativa). El problema de seguir estas indicaciones es que solo sirven si estás en la calle “Null Pointer Exception N° 16”, si estás en otra ya no llegarás a tu destino con las indicaciones recibidas.

– Ir a la entrada de Villa Bug (¡teletransportación!) y atravesar de manera ordenada la lista de calles hasta llegar a tu destino (ruta absoluta).

 

Volvamos a Linux. Suponiendo que estás en tu carpeta home (cd ~) y que quieres mostrar el contenido de un fichero txt, puedes usar:

cat Documentos/informe.txt (relativo)
cat /home/bruno/Documentos/informe.txt (absoluto)

 

¿Cuando usar uno u otro? Depende de lo que estés haciendo.

Por ejemplo, tengo un script que ejecuto usando un alias que está en el fichero ~/.bashrc y que uso para compilar varios proyectos con maven.

El script lo ejecuto desde la primera terminal que tenga a mano, independientemente del directorio en el que esté la terminal en ese momento.

En este caso el script usa la ruta absoluta hacia la carpeta con el código, pues no puedo confiar en estar en el directorio correcto.

 

Otro ejemplo, estoy desarrollando una web en HTML y quiero enlazar una imagen.

En este caso tengo que usar una ruta relativa, ¿por que? Porque si uso una absoluta solo va a funcionar en mi ordenador, si le paso el código a otra persona la imagen no se verá a menos que tenga la imagen exactamente el mismo sitio.

Dentro del directorio hay una carpeta llamada imgs y dentro la foto. Es correcto.
<img src”imgs/foto.jpg” alt=”foto”>

En el directorio padre del actual (../) hay una carpeta llamada imágenes y dentro la foto. Correcto también.
<img src”../imagenes/foto.jpg” alt=”foto”>

En mi carpeta imgs que esta en mi home tengo la foto. Incorrecto.
<img src”/home/bruno/imgs/foto.jpg” alt=”foto”>

Yo me voy por mi izquierda…

chown

Comando chown – Cambiar el propietario

El comando chown (change owner) permite modificar el dueño de uno o varios ficheros o carpetas.

Está instalados en todas las distribuciones GNU/Linux, dentro del paquete coreutils.

Puedes consultar el listado de usuarios en el fichero /etc/passwd usando el siguiente comando:

 cat /etc/passwd | cut -d ':' -f1

 

chown

Sintaxis de chown

sudo chown {{dueño}}:{{grupo}} {{nuevodueño}} {{fichero-o-carpeta}}

Opciones de chown

-c, –changes Igual que la opción “verbose” pero solo si hay cambios
-f, –silent, –quiet Omite la mayoría de los mensajes de error
-v, –verbose Muestra el resultado de cada fichero procesado
–dereference Afecta a la referencia del enlace simbólico, en lugar del enlace simbólico en si (opción por defecto).
-h, –no-dereference Afecta al enlace simbólico, en lugar de la referencia a la que apunta.
–from=DUEÑO_ACTUAL:GRUPO_ACTUAL Cambia el dueño y/o grupo del fichero solo si el actual dueño y/o grupo coincide con el especificado.
Cualquiera de los dos puede ser omitido.
–no-preserve-root No trata “/” de manera especial (por defecto)
–preserve-root Falla al intentar operar recursivamente sobre “/”
–reference=RFILE Cambia la propiedad de file a la del fichero rfile.
-R, –recursive Se ejecuta sobre ficheros y directorios recursivamente
-H *Si es un enlace simbólico a un directorio, entra en el.
-L *Atraviesa todos los enlaces simbólicos a directorios que encuentre.
-P *No atravesar enlaces simbólicos (por defecto)
-v, –verbose Muestra el resultado de cada fichero procesado
–help Muestra la ayuda
–version Muestra la versión y licencia

* Se utiliza junto con el modificador -R

Cambiar el dueño de un fichero

Sintaxis

sudo chown {{usuario}} {{fichero}}

Ejemplos

sudo chown jose documento.txt

El fichero documento.txt que está dentro del directorio actual pasa ser propiedad del usuario jose.

sudo chown juan /home/bruno/Documentos/Reporte.pdf

El fichero Reporte.pdf pasa a ser propiedad del usuario juan, con independencia del directorio en el que te encuentres.

sudo chown pedro ~/Imágenes/foto.jpg

El fichero foto.jpg dentro de /home/TuUsuario/Imágenes pasa a ser propiedad de pedro.

sudo chown francisco “/home/bruno/Documentos/fichero con espacios.odt”

El fichero “fichero con espacios.odt” pasa a ser propiedad de francisco. Si el fichero o alguna carpeta tienen espacios debe estar entrecomillado.

Cambiar el dueño de todos los ficheros recursivamente

Sintaxis

sudo chown -R {{usuario}} {{carpeta}}

Ejemplos

sudo chown -R juan Imágenes

La carpeta Imágenes, y todos los ficheros/carpetas que están dentro (-R) pasan a ser propiedad de juan.

sudo chown -R jose “/home/bruno/Mis Imágenes”

La carpeta Mis Imágenes y todo su contenido pasa a ser propiedad de jose

sudo chown -R vicente ~/Imágenes

Mi carpeta /home/MiUsuario/Imágenes y todo su contenido pasa a ser propiedad de vicente.

Cambiar el dueño de todos los ficheros y carpetas del directorio actual que pertenecen a un determinado usuario.

Sintaxis

 sudo chown --from={{dueñoactual}} {{nuevodueño}} *

Ejemplos

sudo chown –from=jose bruno *

Todos el contenido del directorio actual que pertenezca a jose pasa a ser propiedad de bruno.

sudo chown –from=bruno fernando *

Todo con contenido del directorio actual propiedad de bruno pasa a ser propiedad de fernando.

Cambiar recursivamente el dueño de todos los ficheros y carpetas del directorio actual que pertenecen a un determinado usuario.

Sintaxis

 sudo chown -R --from={{dueñoactual}} {{nuevodueño}} {{carpeta}}

Ejemplos

sudo chown -R –from=jose bruno Documentos

Todos los fichero y directorios dentro de la carpeta Documentos (-R) que eran propiedad de jose pertenecen ahora a bruno.

sudo chown -R –from=juan bruno /home/juan/

Todos los ficheros y directorios dentro de /home/juan (-R) que eran propiedad de juan pertenecen ahora a bruno.

sudo chown -R –from=vicente jose .

Todos los ficheros y directorios del directorio actual (.) que eran propiedad de vicente pertenecen ahora a jose.

Cambia el dueño de todo el contenido de una carpeta si el actual dueño y grupo coincide con el especificado.

Sintaxis:

sudo chown -R --from={{dueño}}:{{grupo}} {{nuevodueño}} {{carpeta}}

Ejemplos:

sudo chown -R –from=juan:consultores javi Imágenes

La carpeta Imágenes y su contenido, cuyo dueño es juan y pertenece al grupo consultores es ahora propiedad de javi.

sudo chown -R –from=bruno:administradores paco ~

Tu carpeta /home/TuUsuario (~) y su contenido, propiedad del usuario bruno y que pertenece al grupo administradores pasa a ser propiedad de paco.

sudo chown -R –from=bruno:administradores jose /home/bruno

El directorio /home/bruno y su contenido,

Búsquedas complejas: find + chown

Para búsquedas mas complejas es posible usar el comando chown con find, ya que find permite realizar búsquedas por nombre, fecha, tipo, tamaño, etc

sudo find . -iname “*.txt” -exec chown bruno {} \;

Busca todos los archivos con extensión txt y les cambia el propietario a bruno.

sudo find . -type d -exec chown bruno {} \;

Busca todos los directorios (-type d) y les cambia el dueño a bruno.

Minientrada

Solución al mensaje “se ha detectado un problema en un programa del sistema”

Desde hace ya algún tiempo, Ubuntu arrastra un pequeño (aunque molesto) problema. Se titula “Se ha detectado un problema en un programa del sistema” y es cortesía del sistema de reporte de errores de Ubuntu (apport).

se-ha-detectado-un-problema-programa-sistema

Lo que ha ocurrido es que alguna aplicación se ha cerrado inesperadamente, el fallo se ha almacenado en /var/crash y apport insiste en reportarlo.

 

No es un problema excesivamente importante, aunque es bastante molesto y alarma a los nuevos usuarios, que creen que está fallando constantemente algo.

 

Hay dos soluciones: limpiar la carpeta donde se almacenan los informes de errores o desactivar la aplicación que reporta los errores (apport).

 

¿Como borro el log de los errores de Ubuntu?

Pues es sencillo, solo es necesario ejecutar el rm como root sobre el contenido de la carpeta.
sudo rm /var/crash/*

 

¿Como desactivo el reporte de errores en Ubuntu?

Editando el fichero [b]/etc/default/apport/b] con cualquier editor:
sudo nano /etc/default/apport
sudo gedit /etc/default/apport
sudo pluma /etc/default/apport
sudo kate /etc/default/apport
sudo vi /etc/default/apport

Y cambiando el valor de enabled a 0. Tal que así:
enabled=0

Ejecutar comando sudo sin contraseña

Como probablemente ya sabrás, GNU/Linux dispone de un sistema de gestión de permisos que permite establecer que acciones puede realizar un usuario, su grupo y otros usuarios sobre un fichero/carpeta/enlace simbólico/aplicación.

Mas allá de los permisos de usuario, existen determinadas acciones (crear usuarios, modificar ficheros del sistema, crear particiones, etc) que requieren permisos de root (superusuario/administrador), ahí es donde entra el comando sudo.

comando-sudo-sin-contraseña

El comando sudo permite realizar una escalada de privilegios, es decir, permite realizar acciones como si fueras root, logrando así el control total del sistema operativo.

Sigue leyendo

Applet para capturar región de pantalla

Hace algún tiempo un compañero de trabajo me preguntó si existía algún modo de capturar un área de la pantalla sin tener que abrir shutter.

La solución pasa por crear un pequeño script que capture el área seleccionada (usando el comando scrot) y copiarlo al portapeles (comando xclip).

El script se lanza desde un applet anclado a la barra de mate, aunque se puede hacer en otros escritorios de forma similar.

Sigue leyendo

Particionamiento vertical

20 consejos para optimizar consultas SQL

1.- Elije el motor de almacenamiento mas apropiado

Los principales motores de búsqueda son MyISAM e InnoDB, pero existen muchos otros como Aria, TokuDB, XtraDB o archive.

MyISAM es mas apropiado en aquellos casos en los que predominen las consultas SELECT.

Sus principales características son:
– Bloqueo a nivel de tabla
– Mayor velocidad en consultas SELECT
– Alta compresión
– Búsquedas full-text
– No soporta claves foráneas

InnoDB es mas apropiado si predomina los INSERT, UPDATE o DELETE

Sus principales características son:
– Bloqueo a nivel de fila
– Permite claves foraneas
– Búsquedas full-text a partir de la versión 5.6.4
– Permite transacciones

Mención especial para Aria (como alternativa a MyISAM) y Archive (para almacenar logs).

 

2.- Evita select *

Selecciona tan solo aquellas columnas que realmente vayas a utilizar.

Seleccionar mas columnas de las necesarias aumenta el tiempo que tarda en ejecutarse la consulta y el tiempo de transferencia si la BBDD está en un servidor independiente.

Bien:
SELECT id, titulo FROM tareas;

Mal:
SELECT * FROM tareas;

 

3.- Limita el n.º de resultados

Utiliza una clausula LIMIT si solo necesitas una determinada cantidad de resultados o si estás filtrando por id y por lo tanto solo hay un resultado como máximo.

Bien:
SELECT id, titulo FROM tareas where id = 555 LIMIT 1;

Mal:
SELECT id, titulo FROM tareas where id = 555;

4.- Evita subconsultas

Por cada subconsulta que agregues, MySQL va a realizar una query adicional por cada registro de la query principal.

Si tienes una consulta que muestra 100 resultados, realizará 100 consultas adicionales por cada subconsulta.

Bien:
SELECT t.id, t.nombre, s.salario
FROM trabajadores t
JOIN salarios s ON s.trabajador = t.id

Mal:
SELECT t.id, t.nombre, (SELECT salario from salarios s where s.trabajador = t.id) as ‘salario’
FROM trabajadores t

 

5.- Guarda direcciones IP como unsigned int

Guarda las direcciones IP como un entero sin signo. PHP permite convertir una IP con ip2long y long2ip para revertir el proceso.

6.- Optimiza la consulta para la cache

Algunas funciones impiden a MySQL cachear la consulta, por ejemplo, la función now() obtiene la fecha/hora actual cada vez que se ejecuta.

Una solución sería obtener la fecha en el lenguaje que estés usando junto con SQL (PHP, JAVA, etc)

 

7.- Join con el mismo tipo de columna

Hacer join con una columna del mismo tipo y tamaño es mas rápido.

8.- Autoincrementales unsigned

Los autoincrementales no pueden ser negativos, estableciendo la columna como unsigned ganas un bit extra, lo que permite guardar valores mas grandes.

Tipo Bytes Mínimo Máximo Unsigned
TINYINT 1 -128 127 No
0 255 Si
SMALLINT 2 -32768 32767 No
0 65535 Si
MEDIUMINT 3 -8388608 8388607 No
0 16777215 Si
INT 4 -2147483648 2147483647 No
0 4294967295 Si
BIGINT 8 -9223372036854775808 9223372036854775807 No
0 18446744073709551615 Si

 

9.- EXISTS en lugar de IN

Utiliza exists siempre que sea posible, ya que EXISTS deja de buscar cuando encuentra una coincidencia.

 

10.- Evita usar WILCARD (%)

El wilcard (%) penaliza seriamente el rendimiento, utilizalo solo si es estricamente necesario.

Mal:
SELECT id, usuario, password
FROM usuarios
WHERE usuario LIKE ‘%bruno%’;

Bien:
SELECT id, usuario, password
FROM usuarios
WHERE usuario = ‘bruno’;

 

11.- Utiliza CHAR en lugar de VARCHAR

CHAR es hasta un 50% mas rápido que VARCHAR, aunque tiene dos incovenientes:
– Ocupa mas espacio en disco
– Tiene un límite de 255 caracteres.

 

12.- Utiliza el tipo de columna ENUM

Enum es un tipo de columna que permite almacenar un listado de valores que internamente se guardan como un TinyInt.

Es ideal para almacenar valores fijos, como por ejemplo: colores, sexo, estados, etc.

13.- Evita usar ORDER BY RAND

Cuando agregas la claúsula ORDER BY RAND, lo que MySQL va a hacer es:
– Seleccionar TODOS los registros que cumplan con tu claúcula WHERE
– Los carga en memoria o en una tabla temporal
– Asociar valores aleatorios a cada fila
– Los ordena
– Muestra N resultados de acuerdo a la claúsula LIMIT

Algunos motores de BBDD, como Oracle, ni tan siquiera permiten realizar esta acción.

14.- Guarda los logs en el motor ARCHIVE

Archive está pensado para guardar un gran volumen de datos.

Permite INSERT y SELECT, pero no DELETE, REPLACE o UPDATE, aunque puedes hacer un TRUNCATE para vaciar la tabla.

Este motor es un buen candidato para almacenar logs.

15.- Las columnas pequeñas son mas rápidas

Utiliza siempre el tamaño justo para la columna.

Por ejemplo, si vas a guardar un DNI, no tiene sentido tener un campo de 20 caracteres, ya que el DNI está formado por 9 caracteres.

 

16.- Particionamiento vertical

En ocasiones ocurre que tenemos tablas con columnas que no son estricamente necesarias.

Imagina una tabla que se emplea para inciar sesión y que además tiene información adicional del usuario.

Tabla sin particionar

Dado que el nombre, apellidos y el DNI no son necesarios para iniciar sesión, lo mas lógico es mover las columnas a otra tabla (ficha_usuario) y referenciar a la tabla usuarios.

Particionamiento vertical

17.- Usan explain

Explain permite obtener información acerca de como se va a ejecutar la consulta, para así optimizarla.

Ejemplo:
EXPLAIN SELECT t.id, t.nombre, s.salario
FROM trabajadores t
JOIN salarios s ON s.trabajador = t.id

 

18.- Indexa las columnas sobre las que ejecutes búsquedas

Por ejemplo, en la tabla libros, sería apropiado indexar el nombre del libro o el ISBN, dependiendo del uso que le estés dando.

Indexar campos búsqueda

19.- Benchmark

La función BENCHMARK ejecuta una exprensión N veces. Se utiliza para conocer cuán rápido ejecuta MySQL la expresión.

El resultado de la consulta siempre es 0 (no va a seleccionar NADA), lo importante es el tiempo que tarda en ejecutar la consulta.

SELECT BENCHMARK(500000,ENCODE(‘hola’,’adios’));
+———————————————-+
| BENCHMARK(500000,ENCODE(‘hola’,’adios’)) |
+———————————————-+
|                                            0 |
+———————————————-+
1 row in set (2.46 sec)

20.- Sígue a The Linux Alchemist

Seguir a The Linux Alchemist aumenta el rendimiento de todas las base de datos en un 125%, trust me I’m an engineer.