sábado, 18 de junio de 2016

Fundamentales. De unos y ceros




Hoy vamos a ver un tema muy cercano al hierro y a su vez a las matemáticas pero unido con los sistemas operativos, aplicaciones, lenguajes de programación... Vamos a ver en qué consisten las unidades de información, los diferentes sistemas numéricos usados en nuestro mundillo y algo de lógica booleana.

Definiciones

Lo primero es lo primero, ¿qué es eso de los unos y los ceros? Casi seguro que todos lo sabéis. Se trata de bits (acrónimo de Binary Digits), que es la unidad mínima de información que puede manejar un sistema digital. A nivel de la máquina, de una forma muy simplista pero válida, la presencia o ausencia de señal eléctrica es lo que define a su vez el estado uno o cero: encendido o apagado. Se suele representar con la letra b minúscula

¿Qué pasa si agrupo varios bits?: pues que obtenemos estructuras de información más complejas. Repasemos las principales:

Byte: consiste en un conjunto agrupado de 8 bits (normalmente). Ocasionalmente, y para no usar el anglicismo, también lo llamamos octeto. Lo representamos con la letra B mayúscula. Tiene 28=256 valores posibles.

Una cuestión importante cuando hablamos de los bits dentro de un byte es del peso del mismo. Todos habréis oído eso de “bit más significativo” o “bit menos significativo”.

El bit menos significativo o LSB (Least Significant Bit) hace referencia al bit más a la derecha, el que menos valor tiene ya que su peso es de 20=1 multiplicado por su valor, es decir vale 1 en decimal si el bit vale 1 y vale 0 en decimal si el bit vale 0.

El bit más significativo o MSB (Most Significant Bit) es el bit más a la izquierda, el que más valor o peso tiene: 27=128, es decir, que si el octavo bit es 1 vale 128 en decimal y si es 0, pues obviamente, también vale 0 en decimal.

En ciertos métodos estenográficos se usa el LSB para ocultar información porque su alteración es despreciable si el valor se “usa” de forma analógica, como puede ser el valor de color de un pixel o la amplitud de una onda de sonido.

Word: o palabra. En la estructura x86 es un conjunto de 16 bits, o 2 Bytes pero se mantiene por compatibilidad en la arquitectura x86-64 con el mismo tamaño. Tiene 216= 2562=65536 valores posibles.

DWord: o doble palabra…pues el doble que la anterior: 32 bits, 4 Bytes o 2 palabras. Tiene 232= 655362=4294967296 valores posibles.

QWord: o cuádruple palabra. Otra vez doblamos la anterior: 4 bits, 8 Bytes, 4 palabras o 2 doble palabras y como en los casos anteriores elevamos al cuadrado el numero anterior de valores posibles: tiene 264= 42949672962=18446744073709551616 valores posibles!

Sistemas numéricos usados en informática

En nuestro mundo usamos 4 sistemas: binario, octal, decimal y hexadecimal. La realidad es que el sistema octal apenas se usa, pero por lo menos que sepáis de su existencia.

Binario: se representa con dos dígitos o guarismos diferentes ya que solo puede tener dos posibles valores: 0 y 1. Es el mas básico y el que usa el ordenador internamente, la información se almacena, sea en disco, memoria, registros de CPU, etc., con este sistema…ya veremos qué pasa cuando llegue la informática quántica! J

Octal: en este caso que puede tener 8 valores diferentes usa 8 guarismos: 0, 1, 2, 3, 4, 5, 6, 7. En un sistema de base 8 que se usaba para representar triadas de números binarios o bits. Para que veáis un caso donde todavía se usa: cuando cambiamos los atributos de un archivo/directorio en Linux con chmod y usamos algo así como chmod 750 mifichero, ese 750 son valores octales:

·         7 octal = 111 binario = rwx en nuestros atributos de Linux.
·         5 octal = 110 binario = rw- en nuestros atributos de Linux.
·         0 octal = 000 binario = --- en nuestros atributos de Linux.

Evidentemente, en este caso, como los valores se representarían igual en decimal o hexadecimal que en octal no se ve claramente que este sea el sistema numérico usado.

Decimal: el sistema más universal y que usamos a diario en nuestra vida cotidiana. Es un sistema de base 10 cuyas cifras se representan con 10 guarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Hexadecimal: Este sistema se usa de forma casi exclusiva en el mundo de la computación. Es un sistema de base 16 que representamos con los siguientes 16 guarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F que tienen el valor decimal de 0 a 15 para la F. Su uso esta tan extendido porque permite representar el valor de un Byte con dos dígitos: 11111111 binario = 255 decimal = FF hexadecimal.

Cuando nos referimos a valores hexadecimales, y para evitar confusión con otras bases, los debemos representar con 0x (cero x) delante del valor, como por ejemplo 0xFF o 0x1234. También los podremos encontrar con una letra h (minúscula o mayúscula) detrás de la cifra: FFh o 1234H.


Tabla ASCII con los valores decimal, hexadecimal y octal de algunos caracteres.


Equivalencia de los primeros valores en los cuatro sistemas de numeración


Evidentemente el cambio de base de un valor es relativamente sencillo y os recomendaría que busquéis vosotros mismos información y aprendáis a hacerlo. Familiarizarse con esta parte de las matemáticas es tremendamente útil en nuestra profesión!

Lógica binaria

Este es un tema que usamos todos los que nos dedicamos a la informática, seamos programadores, nos dediquemos a redes y o sistemas…

Esta lógica está basada en el álgebra de Boole y aunque existen más operaciones, solo vamos a ver las más usuales:

·         Negación o complemento (NOT)
·         Suma o disyunción (OR)
·         Multiplicación o conjunción (AND)
·         Suma o disyunción exclusiva (XOR)

Negación o complemento (NOT)

Este operador invierte el valor al que se le aplica. La negación del valor binario 1 es 0 o dicho de otra forma: 1 = NOT 0. En programación se suele usar el signo de la exclamación cerrada (!) para representarlo, de forma que 1!=0.

Para representar las salidas en función de las entradas de un operador lógico se usan las tablas de la verdad. La siguiente es la tabla de la verdad del operador NOT:



En secuencias lógicas, como las que podemos escribir en los filtros del Wireshark, usamos el operador para indicar que aplique el filtro si no se cumple la condición.

Si por ejemplo quiero que solo capture los paquetes UDP pondré la condición en el filtro como muestro a continuación:



Pero si lo que quiero es que capture todos los paquetes excepto los UDP usaré el operador NOT para indicarlo:



¿Qué ocurre si aplico este operador a un byte completo?, pues que todos los bits de ese byte se invierten: 10010110!=01101001.

Suma o disyunción (OR)

La suma lógica requiere de 2 o más entradas con las que operar, básicamente se puede decir que el resultado en 1 si cualquiera de las entradas tiene el valor 1.  En programación se suele usar tanto el término OR como el doble pipeline (||). La tabla de la verdad de este operador es la siguiente:



Usemos de nuevo los filtros de captura de Wireshark para mostrar cómo usar este operador en una sentencia lógica: siguiendo con el ejemplo anterior, quiero hacer un filtro que capture todos los paquetes que no sean UDP o que sean peticiones al puerto 80:


Si aplicamos el operador a un par de Bytes se hará la operación bit a bit para cada posición: 01010001 OR 11000100 = 11010101

Multiplicación o conjunción (AND)

La conjunción AND requiere que las dos entradas sean 1 para que la salida sea 1, en cualquier otro caso la salida es 0. Se suele indicar tanto con el término AND como con el doble ampersand (&&). Su tabla de la verdad es la siguiente:



Sigamos con los filtros de captura de Wireshark para ver su uso en sentencias lógicas. Ya teníamos un filtro donde capturábamos todos paquetes que no fueran UDP o que fueran peticiones al puerto 80. Ahora queremos incluir la condición que sea del protocolo IPv6 (ojo a los paréntesis para agrupar las operaciones):



Vamos a operar un par de Bytes con este operador que también se hará la operación bit a bit para cada posición: 01010001 AND 11000100 = 1000000
Este operador también se usa para calcular la dirección base de una red usando como entradas la dirección Ip y la máscara de subred (en formato binario ambas).

Suma o disyunción exclusiva (XOR)

Este operador, usada en los sumadores digitales junto a un operador AND, de una resultado de 1 solo si solo una de las entradas es 1. Esta es su tabla de la verdad:



Este operador no se usa en los filtros de Wireshark por lo que omito el ejemplo de uso, en cambio si es usado en creación de máscaras de imagen, en criptografía, generación de números pseudo-aleatorios, detección de correlación y secuencia… También nos permite calcular la dirección de broadcast de una red usando como datos de entrar la dirección Ip y la máscara de subred.

Todas estos operadores (excepto NOT) tienen sus correspondientes “versiones” negadas: NOR, NAND y XNOR que tienen el resultado de salida invertido a sus “versiones” no negadas.

En un contexto típico de programación no nos referimos a los valores lógicos 1 y 0 de esta forma, se suele usar True y False respectivamente para inicializar variables, comparar en sentencias de control, etc.


Lo que hemos visto en este post es un tema, que no es que sea de obligado conocimiento, es necesario controlar para poder desenvolvernos con soltura en el mundo de la informática.

sábado, 11 de junio de 2016

Fundamentales. Atributos de los archivos




¿Qué es eso que sale cuando listo con detalle un directorio?

Esto es lo puedo ver cuando hago un listado de archivos en un directorio con el comando “ls -la”:



Vamos a ver con detalle que información aparece:

El primer dato que devuelve el comando es “total 32”. Esto nos indica el espacio en bloques de 1KB (1024 Bytes) que ocupan todos los archivos que están en este directorio.

El resto de líneas nos muestran la información detallada de los directorios o ficheros existentes.
Vamos a usar como ejemplo la tercera línea: el fichero filtrado.txt.
-rw-rw-r--  1 lubuntu lubuntu  6515 jun  4 11:26 filtrado.txt

La primera parte, que es ese montón de letras sin aparente sentido son los atributos o permisos del archivo. Lo veremos en detalle después, vamos primeramente a ver cosas más sencillas.
Seguidamente tenemos un número, en nuestro ejemplo el valor es 1, que indica el número de enlaces que existen a este fichero.

A continuación, tenemos el nombre del usuario y el nombre del grupo propietario del fichero, en este caso usuario lubuntu, grupo lubuntu. Pensar que un fichero puede ser propiedad de un grupo al que no pertenece el usuario, por ejemplo, usuario lubuntu, grupo root. Esto afecta a la gestión de seguridad de acceso del fichero en cuestión.

Después nos encontramos otro número: 6515. Es el tamaño en bytes del fichero. Os recomiendo usar el parámetro “-h” (Human readable) junto a nuestro “ls -la” para que la información de tamaño, sobre todo en el caso de archivos de gran tamaño, sea más fácilmente legible. Este es un ejemplo de como se ve una lista de directorio con y sin -h con archivos de cierto tamaño:



Como podéis observar, usar -h nos evita contar el número de dígitos para leer el tamaño correctamente.

Seguimos con nuestra línea. Ahora tenemos la fecha y la hora de última modificación del archivo: “jun  4 11:26”. Veréis que el año no aparece por que ha transcurrido menos de ese periodo de tiempo desde la última modificación. ¿Qué ocurrirá el 4 de junio de de 2017 a las 11:27 de la mañana?: pues que si no se ha modificado el fichero desde la fecha que vemos hoy, el comando nos mostrará “jun  4  2015”, es decir, tendremos precisión de hasta minutos en esta información durante un año, después se considera que con saber el día de la última modificación es más que suficiente J!

No es necesario explicar que el último dato que aparece es el nombre del fichero: filtrado.txt

Ahora los atributos

Pues vamos al meollo del post, ver que significan y que información nos aportan los atributos de seguridad de un archivo.

Vemos que es una lista de 10 caracteres que indican lo siguiente:
·         Primer carácter. En el ejemplo veréis valores diferentes (d, l, -). Puede tener otros valores, pero estos son los 3, llamémoslo, principales. ¿Que nos indica?: el tipo de objeto que es:
o   d: indica que es un directorio. Sí, eso del punto y los dos puntos también son “punteros” a directorios: el punto es un puntero al propio directorio que estáis mostrando y los dos puntos al directorio padre, es decir el directorio jerárquicamente anterior en el árbol de directorios.
o   l: nos dice que es un enlace (link) a otro archivo. En nuestro ejemplo veréis que hay un archivo readme.sll.txt que apunta al fichero /usr/share/doc/ssl-cert/README. Esto nos permite actuar sobre el fichero apuntado (el /usr/share/…/README) usando nuestro enlace (readme.sll.txt), para por ejemplo visualizar su contenido o editarlo. Cuando hacemos nano readme.sll.txt, realmente estoy editando el fichero README en /usr/share/. ¿Y qué pasa si borro con un rm el enlace?, pues eso, que borro el enlace, no el fichero enlazado.
o   -: un sencillo guion nos indica que lo que estamos viendo es ni más ni menos que un simple archivo.

Los 9 caracteres siguientes son 3 grupos de 3 atributos y vamos a verlos así.

  •     El primer grupo de 3 indica que permisos tiene el usuario, en este caso lubuntu, sobre el fichero. Cada carácter indica una cosa y siempre están en el mismo orden:

o   r: tenemos permiso de lectura (Read) sobre el fichero. Si aparece un guion indica que no tenemos ese permiso.
o   w: indica que tenemos permiso de escritura (Write) sobre el fichero. Como en el caso anterior si aparece un guion indica que no tenemos ese permiso.
o   x: tenemos permiso de ejecución (eXecution) sobre el fichero, y como anteriormente si aparece un guion indica que no tenemos ese permiso.
  •  El segundo grupo de 3 caracteres indica que permisos tiene el grupo, también en este caso el grupo se llama lubuntu sobre el fichero. Los valores que podremos ver son los mismos que en el caso anterior
  • Y por último, el tercer grupo nos indica que permisos tiene el resto de usuarios/grupos. Tambien puede tener los mismos valores.


Ahora vamos a analizar nuestro ejemplo: el archivo filtrado.txt tiene los atributos -rw-rw-r—

El primero, “-“, nos dice que es un archivo.

El grupo de permisos de usuario es “rw-“: el usuario lubuntu tiene permisos de lectura y escritura.

El grupo de permisos del grupo es también “rw-“, por tanto todos los usuarios que pertenezcan al grupo “lubuntu” también tendrán permisos de lectura y escritura sobre el archivo.

Por último, tenemos el grupo de permisos de otros, que en este caso es “r—“, lo que indica que cualquier usuario que no sea lubuntu o pertenezca al grupo lubuntu solo podrá leer el archivo.
Como veis no es posible ejecutar el archivo para ningún usuario ni grupo por no tener el atributo “x” de ejecución activo.

Y esto es todo por hoy, en próximos post veremos cómo actuar sobre los permisos de los archivos y muchas más cosas.


domingo, 5 de junio de 2016

Fundamentales. Redirecciones: stdout y stdin




Algo realmente útil que tienen los comandos, no todos, de Linux/Unix es la posibilidad de redirigir su salida como entrada de otro comando.

stdout, standard output o salida estándar es la más fácil de entender: se refiere a la información que devuelve un comando cuando es ejecutado, si no indicamos otra cosa, a la pantalla o terminal.

stdin, standard input o entrada estándar: aquí la cosa se complica más. Hay que ver cada comando si tiene alguna de sus parámetros habilitados para ser indicados como entrada estándar.

Vamos a ver por ejemplo que nos dice la ayuda del comando cat, para lo cual hacemos man cat en la consola:




En la descripción vemos que concatena el fichero o ficheros indicados en el parámetro FILE o el contenido de la entrada estándar hacia la salida estándar.

Vemos ahora las instrucciones del comando grep:



Nos dice en la descripción que buscará el patrón indicado en el/los ficheros indicados en FILE o en la entrada estándar si no indicamos ningún fichero o indicamos – (guión) como nombre de fichero.

Caso práctico

Supongamos que queremos hacer lo siguiente: visualizar la lista de ficheros modificados en febrero en el directorio /etc.

Para hacer esto necesitamos:
  1. Listar el directorio con el comando ls
  2. Filtrar la lista con los ficheros que fueron modificados en febrero con el comando grep
  3. Visualizar la lista de forma paginada para verla con comodidad con el comando less


Primero vamos a ver cómo no debe de hacerse, pero creo que os ayudará a entender cómo funciona cuando lo hagamos correctamente usando la redirección.

Como funciona, pero NO debe de hacerse

Primer paso: listamos el contenido del directorio y volcamos su stdout a un fichero llamado lista.txt:

ls -l /etc >lista.txt

El comando no devuelve nada, pero si miramos con ls (o ll, o la, etc) el directorio actual veremos lo siguiente:



Se ha generado un fichero con el nombre lista.txt que si miramos con cat, por ejemplo, contendrá la lista de todos los ficheros del directorio /etc

Segundo paso: filtramos el contenido del fichero lista.txt y generamos uno filtrado llamado filtrado.txt:

grep “ feb “ lista.txt > filtrado.txt

Igual que con el comando anterior no veremos nada en la salida del comando pero con ls comprobaremos que se ha generado otro fichero llamado filtrado.txt:



Tercer paso: visualizar el fichero filtrado.txt de una forma cómoda que nos permita paginar y movernos arriba y abajo en su contenido:

less filtrado.txt




Facil, no?...pues no señor@s!: tres pasos, dos ficheros que luego tendremos que borrar porque no nos sirven para nada…

¿Cómo SI debe de hacerse usando redirecciones?

Ahora vamos a hacer lo mismo usando redirecciones. Para redirigir la salida de un comando a otro se usa el carácter pipeline  “|” (con Alt Gr+1).

Primer y único paso: Ejecutamos el listado del directorio, redirigimos al filtro y la salida de este la redirigimos nuevamente al visor:

ls -l /etc|grep “ feb “|less

Resultado, el mismo, pero mucho más elegante y sencillo.



Redirección de stdout a fichero

Aunque lo hemos usado en el ejemplo voy a aclarar cómo se redirige la salida estándar de un comando a un fichero. En este caso no se usa el pipeline, sino el símbolo de mayor que “>”. Hay, llamémoslo, dos formas de usarlo:

  • Si se pone una sola vez, por ejemplo: ls -l > fichero.txt, la salida del comando ls generará un fichero llamado fichero.txt, pero si este fichero ya existía previamente se perderá la información que contenía, es decir, que la nueva información sustituirá a la anterior.
  • Podemos ponerlo dos veces, por ejemplo: ls -l /etc >>fichero.txt. En este caso la salida del comando ls se añadirá al final del fichero, no perdiéndose la información contenida en él previamente y en el caso de que no exista se creará.

En las próximas semanas seguiremos publicando más artículos relacionados con los Básicos de Linux, dado que queremos generar información para los socios que están haciendo los talleres de introducción.


Gracias y nos vemos ...