Mostrando entradas con la etiqueta aprendizaje. Mostrar todas las entradas
Mostrando entradas con la etiqueta aprendizaje. Mostrar todas las entradas

viernes, 30 de enero de 2015

Ver información sobre los usuarios

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Continuamos con la gestión de usuarios con un comando que es una implementación especial del comando useradd.

adduser
Sirve para añadir usuarios nuevos al sistema de forma interactiva, es decir, se nos van preguntando en tiempo real los datos que queremos asignar al nuevo usuario. Veamos una captura de pantalla de este comando.



Como se puede ver hemos añadido el usuario Pakito al sistema; automáticamente le asigna un GID de grupo (aquí conté que son el UID y el GID), nos informa de la creación de su directorio home según los criterios fijados en /etc/skel, nos pide una contraseña para este usuario y, a continuación, nos da la oportunidad de añadir una serie de datos descriptivos que pueden sernos de mayor o menor utilidad, pero ahí están. Emplear adduser o useradd para añadir usuarios al sistema será cuestión del criterio de cada uno.

  • adduser --ingroup users pakito: añadiría al usuario pakito estableciendo users como su grupo principal.
  • adduser pakito cdrom: añade al usuario pakito al grupo cdrom.
users
Muestra un listado de los usuarios logados en el sistema en ese momento.

id
Sirve para mostrar el UID y el GID de usuarios y grupos.
  • id / id -a: en ambas formas, muestra el UID y los GID (si pertenece a más de un grupo) del usuario actual.
  • id pakito: da información sobre el UID y el GID de pakito y las GID de sus grupos.
  • id -g: muestra solo los GID de los grupos efectivos (activos en ese momento).
  • id -G: muestra solo los GID de los grupos reales y efectivos (activos en ese momento y el resto de los existentes).
  • id -nG pakito: lista a qué grupos pertenece el usuario pakito.
  • id -u: muestra solo los UID de los usuarios efectivos (activos en ese momento).
finger
Comando para mostrar todos los datos registrados de un usuario.


Como se ve en la captura, al usar finger con el modificador -s podremos ver datos como el nombre del usuario (paco), el nombre de acceso al sistema (convenientemente "censurado" por un servidor), la terminal desde la que opera (Tty), el tiempo que ha estado sin operar (Idle), la hora de inicio de sesión, la localización de la oficina (office) y su teléfomo (Office Phone). Estos últimos son datos que podríamos haber incluido al crear el usuario con adduser.

Hay otra forma de ver información de un usuario, y es usando finger y su nombre, sin más.


Como vemos, los datos que asignamos al usuario pakito aparecen aquí reflejados, además de la Shell utilizada y si tiene o no correos pendientes.

Y no tiene mucho que ver, pero hace pocos días nos dejó Edgar Froese, que como miembro de Tangerine Dream podemos considerar como uno de los padres de la música electrónica espacial, género que en su momento me tuvo bastante enganchado. En reconocimiento, valga este pequeño homenaje, la obra que encumbró a su banda, "Phaedra".


viernes, 16 de enero de 2015

Matar procesos de forma rápida y eficaz

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

El momento de máxima frustración de cualquier usuario es cuando la aplicación que usas se bloquea y no puedes ir ni hacia delante ni hacia atrás. En GNU/Linux existen varias formas de salir del atolladero, y aunque todas suponen cerrar el proceso en curso, sirven para que el sistema restablezca su normal funcionamiento y podamos seguir trabajando. Por supuesto, todo ello a través de la consola de comandos usando el comando kill.

Lo que hace este comando es enviar señales a los procesos abiertos que, por defecto, indican el final del proceso. Son de uso exclusivo del supersusuario por lo que, si no estamos logados como tal, habrá que antecederlo del sudo.

El modo más eficaz de matar un proceso es utilizar su PID (número de identificación), el cual podemos conseguir de varias formas. Pongamos que quiero matar el proceso correspondiente al programa de diseño 3D Blender; bien, pues usando el comando top veremos monitorizados en pantalla todos los procesos abiertos en tiempo real. Solo tenemos que localizarlo.



Vemos que su PID es 7170, de modo que a continuación usamos kill con el modificador -9:

paco@paco-pc:~/$ sudo kill -9 7170

Otra forma de localizar un PID es empleando el comando ps, que sirve para listar procesos activos:

paco@paco-pc:~/$ sudo ps -ef | grep Blender

Así, en combinación con una tubería y el comando de filtrado grep hallaríamos el PID de Blender.

También podemos matar el proceso tecleando su nombre, en este caso usando el comando killall:

paco@paco-pc:~/$ sudo killall Blender

A veces el nombre del proceso no es exactamente igual al de su aplicación relacionada. Por ejemplo, el reproductor multimedia Kaffeine es ejecutado por el proceso llamado kaffeine-xbu, pero esto no tenemos por qué saberlo. Para estos casos disponemos del comando pkill, con el que podremos matar el proceso tecleando solo parte de su nombre. Ojo, si hay procesos abiertos que compartan esa cadena de texto también se cerrarán.

paco@paco-pc:~/$ sudo pkill kaffeine

De esta forma mataríamos el proceso kaffeine-xbu.

Por último, la manera más gráfica de aniquilar un proceso es con xkill. Con este comando mataremos la aplicación que nos molesta haciendo clic sobre ella con el ratón, cuyo cursor se habrá convertido en una calavera.

paco@paco-pc:~/$ sudo xkill

En fin, con este rosario de comandos no había que estrujarse mucho la sesera para elegir el vídeo del post. Un clásico de los 90 com es este "Killing in the name" de los siempre combativos Rage Against The Machine.


viernes, 3 de octubre de 2014

Creación de usuarios

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Vamos a empezar con una serie de entradas dedicadas a la creación, gestión y supresión de usuarios, algo crucial cuando de un sistema GNU/Linux se trata. Para ello empezaremos diseccionando el principal comando de creación de usuarios como es useradd.

useradd
Para crear un nuevo usuario llamado pepe teclearemos sudo useradd pepe.

  • useradd -c "técnico administrativo" pepe: crea el usuario pepe añadiéndole la descripción que tenemos entrecomillada, y que se denomina campo GECOS. Se usa para proporcionar información extra sobre el usuario relativa a su puesto, ocupación, nombre completo, etc.
  • useradd -d /house/pepe: indica un directorio home alternativo (en este caso sería house) para el usuario pepe. Este directorio ha de existir previamente y después habría que hacer a pepe propietario del mismo a través del comando chown.
  • useradd -e 2015-12-31 pepe: crea el usuario pepe, que será desactivado en la fecha indicada.
  • useradd -f 16 pepe: indica el número de días en que la cuenta se bloqueará por falta de uso.
  • useradd -g grupo1 pepe: crea un grupo primario, aquí denominado grupo1, (grupo principal que un usuario debe obligatoriamente tener asignado) para el usuario pepe, el cual debe existir previamente.
  • useradd -G empleados contables pelotas pepe: especifica los grupos (aquí denominados empleados, contables y pelotas) a los que pertenecerá el recién creado usuario pepe. Dichos grupos deben existir previamente.
  • useradd -m pepe: crea el directorio por defecto home para el usuario pepe.
  • useradd -M pepe: no crea el directorio por defecto home durante la creación del usuario pepe.
  • useradd -n pepe: añade un grupo con el mismo nombre del usuario creado.
  • useradd -N pepe: no crea un grupo con el mismo nombre del usuario.
  • useradd -r pepe: convierte al nuevo usuario pepe en usuario de sistema (que solo gestionan determinados servicios como red, impresoras...).
  • useradd -s /bin/Bash: crea el usuario pepe con la shell Bash por defecto.
  • useradd -u UID pepe: crea el usuario pepe con el UID que le indiquemos.
  • useradd -D: tecleando esto obtenemos los valores por defecto de useradd en la creación de usuarios: los de las variables SHELL (ruta  de la consola por defecto), HOME (ruta del directorio home por defecto), SKEL (directorio a utilizar para proporcionar los contenidos por defecto de los nuevo directorio home de los usuarios), GROUP (la ID por defecto del grupo), INACTIVE (el número máximo de días tras los que se puede cambiar la contraseña una vez haya expirado), y EXPIRE (fecha de expiración por defecto de las cuentas de los usuarios).
  • useradd -D -d /home/paco/practicas: establece la ruta /home/paco/practicas como la ruta por defecto del directorio home para todos los usuarios nuevos a partir de ese momento.
  • useradd -D -e 2015-12-31: establece la fecha indicada como la fecha de expiración de todas las cuentas creadas a partir de ese momento.
  • useradd -D -f 16: especifica que faltan 16 días para la desactivación de la cuenta una vez expirada la contraseña. se aplica a todos los usuarios nuevos a partir de ese momento.
  • useradd -D -g grupo1: especifica el grupo por defecto de los usuarios nuevos a partir de ese momento.
  • useradd -D -s /bin/Bashespecifica que la shell por defecto de los usuarios nuevos será Bash a partir de ese momento.
  • useradd -p `echo 1234 | openssl passwd -crypt -stdin `pepe: crea el usuario pepe con la contraseña de acceso 1234. El comando encripta la contraseña y la redirige al parámetro -p de useradd. No obstante, lo adecuado es crear la contraseña después de creado el usuario, usando el comando passwd.
Para terminar, observemos un ejemplo práctico de creación de usuario con la consiguiente explicación de cada parámetro:

useradd -mNr -s /bin/bash -g casa -c "José Luis Pérez" pepelu

Explicación:

useradd (añade usuario) -m (crea el directorio home por defecto del nuevo usuario) -N (no crea el directorio con el mismo nombre que el nuevo usuario) -r (califica al nuevo usuario como de sistema) -s bin/bash (establece la shell bash como consola por defecto del nuevo usuario) -g casa (establece que el nuevo usuario pasa a formar parte del grupo casa, ya existente) -c "José Luis Pérez" (añade ese comentario descriptivo al campo GECOS) pepelu (nombre del nuevo usuario).

Creo que para ser un solo comando no está nada mal. Hay más opciones y solo tienen que utilizar las herramientas de consulta para dar con ellas. Y, bueno, no tiene mucho que ver, pero estos días he recordado esta canción de Indigo Girls llamada "Galileo", así que concluiremos el post con ella.


miércoles, 24 de septiembre de 2014

Gestión de usuarios: preliminares

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

En este post vamos a hablar de algunos términos que ya se han citado en otras entradas, de modo que lo utilizaremos como una suerte de recordatorio que nos ayudará a concatenar con lo que vendrá después: la creación y gestión de usuarios y grupos. Recordemos que GNU/Linux es un sistema operativo multiusuario, esto es, pensado para que muchas personas trabajen juntas compartiendo datos. Precisamente comenzamos hablando de qué tipos de usuarios existen en un sistema Linux.
  • Usuarios normales: disponen de privilegios parciales sobre los recursos que tengan asignados.
  • Usuarios de sistema: son los encargados de los llamados daemon del sistema, que son procesos ejecutados en segundo y no controlados directamente por el usuario. Son propietarios de algunos de estos procesos y directorios.
  • Superusuario o usuario ROOT: es el que tiene el control total sobre el sistema. Su UID y GID siempre tienen valor cero.
  • UID: número identificador de usuario, el cual puede estar en la franja que va desde el 0 hasta el 65535.
  • GID: número identificador de grupo, el cual puede estar en la franja que va desde el 0 hasta el 65535.
A continuación, algunos comandos que conviene comocer y/o dominar.

su
Este es un comando para logarnos en el sistema como root.

  • su usuario2: de esta forma nos estaríamos logando como el usuario2, siempre que conozcamos su contraseña. De esta forma accederíamos a su directorio HOME.
exit
Nos sirve para salir del modo root.

sudo
Comando ya conocido que nos permite ejecutar órdenes por teclado como si fuésemos root.
  • sudo passwd root: para cambiar, mediante el comando passwd, la contraseña de root.
  • sudo nautilus: para acceder al navegador de archivos Nautilus como usuario root ( y así poder manipular archivos y directorios como se nos antoje sin las restricciones del usuario corriente).
visudo
Comando que nos permite editar automáticamente el fichero /etc/sudoers, donde podemos indicar qué usuarios podrán ejecutar órdenes como si fuesen root a través del comando sudo.

w [usuario]
Sirve para listar los usuarios de un sistema y los datos de su sesión.

write [usuario]
Sirve para comunicarse con otro usuario (una especie de mensajería instantánea).

wall [mensaje]
Para enviar mensajes a todos los terminales del sistema.

mesg [y|n]
Activa o desactiva la facultad de recibir mensajes.

Valga este pequeño post como antesala de lo que nos espera, si el tiempo libre y las fuerzas lo permiten, en relación a la gestión de usuarios y grupos. Y para grupo en el que tenía grandes expectativas, que se han visto deshechas con su temprana disolución, los texanos Fair To Midland. Parecían llamados a ser una de las grandes bandas de rock de comienzos de siglo, pero tendremos que fijar la vista en otra distinta. "Musical chairs" nos recuerdan lo grandes que pudieron ser.


miércoles, 16 de julio de 2014

Archivos de gestión de usuarios y grupos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

A medida que vayamos adentrándonos en nuestro sistema Linux la gestión de usuarios y grupos se convertirá en un asunto capital. Antes de entrar a analizar los comandos que nos permiten crear y gestionar usuarios y grupos vamos a describir los archivos que intervienen en dichas operaciones.

/etc/skel/
Directorio donde se almacenan los archivos que se cargarán al crear un nuevo usuario.

/etc/default/useradd
Este es el fichero donde se guardan los ajustes de usuario.

/etc/logins.defs
Archivo que controla la vigencia de las contraseñas. Vamos a destacar tres variables de entorno relevantes para este aspecto:
PASS_MAX_DAYS: establece la vigencia de las contraseñas en nº de días.
PASS_MIN_DAYS: establece la vigencia mínima en nº de días de una contraseña. Si su valor es cero podremos cambiarla cuando lo queramos.
PASS:WARN_AGE: establece el nº de días a partir del cual se avisará al usuario de la caducidad de su contraseña.

Recordemos que sobre las variables de entorno hablamos aquí.

/etc/passwd
Archivo editable (como root) con la lista de usuarios del sistema. Debería tener permiso de lectura para todos pero solo de escritura para root. Veamos un ejemplo de línea de este fichero:

daemon:x1:1:daemon:/usr/sbin:/bin/sh

Desglose:

daemon: es el nombre de la cuenta.
x: es la clave encriptada.
1: es el UID (User IDentification, identificador de usuario). El UID de valor 0 pertenece al administrador. Por debajo de 100 es de sistema; por encima, de los usuarios.
1: es el GID (Group IDdentification, identificador de grupo).
daemon: es el GECOS o campo destinado a un comentario descriptivo del usuario o grupo.
/usr/bin: directorio del usuario.
/bin/sh: terminal por defecto.

Si quisiéramos crear un usuario manualmente sin recurrir a los comandos al uso, tendríamos que añadir al fichero /etc/psswd una línea similar a la que sigue:

manuel::523:100:ManuelPerezAdministrativo:/home/manuel:bin/Bash

Así, habríamos creado un usuario cuya cuenta recibe el nombre de manuel, con el UID 523, el GID 100, con ManuelPerezAdministrativo como campo GECOS o de comentarios, siendo /home/manuel su directorio de usuario y /bin/Bash su shell por defecto. No tendría contraseña, la cual había que crear con el comando passwd.

/etc/group
Archivo con la lista de grupos y los miembros de cada uno de ellos. Este sería un ejemplo de contenido:

daemon:x:1:<otro>

Desglose:

daemon: nombre del grupo; no puede repetirse y ha de tener un máximo de ocho caracteres.
x: contraseña que permite acceder a un usuario con el comando newgrp (las contraseñas ocultas se sustituyen por una x y se almacenan en el fichero /etc/gshadows).
1: GID, identificador de grupo, que debe ser único.
<otro>: aquí vendrán los nombres de los usuarios miembros del grupo.

Ejemplo de línea añadida manualmente: Compras::1020:Pablo:Silvia:Pedro:Sergio.

/etc/shadow
Archivo donde se almacenan las contraseñas de los usuarios y que solo es accesible como root. Ejemplo de contenido:

daemon:*:14889:0:99999:7:::

Desglose:

daemon: nombre de usuario.
*: contraseña.
14889: fecha de la última modificación de contraseña.
0: nº de días que tardará la contraseña en expirar.
99999: periodo de aviso en días de expiración de contraseña.
7: nº de días que trascurren desde que expira la contraseña hasta que se desactiva la cuenta.
Fecha de desactivación de la cuenta (en caso de proceder).

El campo que lleve un carácter ¡ o un asterisco * indica cuanta bloqueada. Si lleva los caracteres !! o el asterisco * es una cuenta no asignada.

/etc/gshadow
Es el archivo donde se almacenan las contraseñas para los grupos y solo es accesible para root.

Finalizamos con un par de comandos relacionados con todo lo que hemos visto:

grpconv
Sirve para crear el archivo /etc/gshadow y cambiar las contraseñas del archivo /etc/group por una x.

grpunconv
Revierte el resultado de grpconv.

En otro post hablaremos más en profundidad de la creación y gestión de usuarios y grupos. Mientras, escuchemos a este grupo progresivo noruego, Airbag, interpretando "Redemption".


jueves, 12 de junio de 2014

Esquema de sistema de directorios

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Para complementar la anterior entrada les dejo con este esquema de un sistema de directorios GNU/Linux estándar, con sus archivos y subdirectorios más importantes. Algo muy útil para un vistazo rápido, sobre todo para usuarios bisoños.


miércoles, 11 de junio de 2014

Sistema de directorios

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

En esta entrada se van a describir los directorios más importante de Linux, sus funciones y objeto dentro del entramado del sistema. Tengamos en cuenta que todo parte del directorio raíz representado por el símbolo / , que viene a ser como el disco C:/ de los sistemas Windows. Y recordemos a la hora de teclearlos que GNU/Linux distingue entre mayúsculas y minúsculas.

/bin
Contiene los ficheros ejecutables (denominados binarios) esenciales del sistema. También alberga vínculos simbólicos (hablamos de ellos aquí) de archivos binarios que están en otro directorio. A cada comando u orden le corresponde un binario, como pueden ser cat, chmod, cp, date, echo, kill, mkdir, rmdir y muchísimos más.

/boot
Aquí están los archivos que usa el sistema en el proceso de arranque, incluida la imagen binaria del kernel de Linux, que suele denominarse vmlinux o vmlinuz seguido por la versión y la edición.

/dev
Aquí se almacenan los controladores (en Linux denominados módulos) que permiten el acceso a los periféricos habituales del PC como el ratón, el DVD, la impresora o el teclado.

/var
Contiene información diversa generada tanto por el sistema como por los usuarios. Alberga algunos subdirectorios que hay que destacar:

  • /var/lock

Aloja los archivos de bloqueo que comunican al sistema que alguna aplicación no puede acceder a un dispositivo en concreto.

  • /var/log

Almacena los registros detallados de toda actividad desarrollada durante la sesión de trabajo.

  • /var/spool

Contiene la información lista para ser enviada, como pueden ser trabajos de impresión o correos electrónicos.

/lib
Alberga las librerías usadas por diferentes aplicaciones, evitando así que cada programa incluya las suyas propias y se produzca una redundancia de datos. Tiene especial importancia el directorio /lib/modules que contiene los módulos cargables del kernel.

/etc
Contiene los archivos de configuración del sistema, que en principio solo son accesibles para el administrador del sistema o root, pero en la práctica el usuario medio tiene permiso de lectura para casi todos sus archivos. Aquí encontraremos archivos de configuración de diferente relevancia como passwd, lilo.conf, hosts y skel entre otros.

/home
Aquí encontramos la estructura de directorios de cada usuario dentro del sistema y cada uno tendrá la suya propia. Es recomendable guardar este directorio en una partición aparte al diseñar el sistema de particionado para evitar pérdidas de datos irreparables.

/sbin
Contiene los binarios correspondientes a los comandos esenciales del administrador del sistema. Dicho administrador será quien los use habitualmente.

/usr
Almacena las aplicaciones y recursos disponibles para los usuarios dentro de nuestro sistema, Hay que destacar los siguientes subdirectorios:

  • /usr/bin

Contiene la mayoría de programas y comandos de los que puede disponer el usuario.

  • /usr/share

Contiene datos compartidos, independientes de la máquina en la que nos encontremos, como la documentación de los programas o imágenes de escritorio.

  • /usr/doc

Contiene documentación de herramientas tales como GNOME o el compilador gcc.

  • /usr/games

Aquí hay ejecutables de juegos y software educativo.

  • /usr/include

Alberga archivos de encabezados de C/C++ y directorios que contienen ciertos archivos de encabezados específicos, necesarios para escribir aplicaciones de red y del sistema.

  • usr/local

Aquí tenemos software y datos instalados localmente por el administrador del sistema con vistas a ser compartidos por otros ordenadores.

/tmp
Directorio tamporal normalmente usado por las aplicaciones para almacenar algunos ficheros en tiempo de ejecución. El sistema lo vacía periódicamente.

/opt
Este directorio sirve para instalar paquetes de software adicionales que pueden ser instalados por los usuarios.

/root
Suele ser el directorio inicial de la cuenta del superusuario o root, por lo tanto tiene el acceso protegido frente al resto de usuarios.

/lost+found
Contiene los archivos del sistema que no están asociados a ningún directorio y que pueden ser encontrados mediante la herramienta fsck (comprobación del sistema de archivos). Los administradores los emplean, básicamente, para comprobar los sistemas de archivos.

/mnt
Es utilizado por los administradores para montar temporalmente sistemas de archivos a través de la orden mount. Suele contener montajes como el del lector de CD o DVD y de los discos duros. Al montar un dispositivo se crea un nuevo directorio al que se puede acceder como a cualquier otro, permitiéndonos explorar su contenido.

/media
Contiene una estructura de directorios pertenecientes a cada uno de los dispositivos que montemos en nuestro sistema. Por cada unidad CD/DVD o memoria USB que instalemos en el sistema se irán sucediendo subdirectorios del tipo /media/cdrom0 (la primera unidad de CD), /media/usbdisk (la primera memoria USB), y así todo.

Y como hemos hablado del sistema, terminamos con un vídeo de los hard-rockeros alternativos System Of A Down llamado "Chop suey".



jueves, 16 de enero de 2014

Buscar y localizar archivos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

El capítulo de hoy bien podría haber estado junto al de filtrado de archivos pero se hubiera hecho demasiado extenso y cansino, de modo que me ha parecido bien separarlo. Se trata de comandos para buscar y, por supuesto, encontrar archivos y directorios, el tipo de herramientas que siempre es bueno conocer y tener a mano.

find
Es el clásico comando de UNIX para encontrar archivos y directorios.
find -name lp: encuentra el fichero lp dentro del directorio actual.
find -iname lp: lo mismo pero sin tener en cuenta la diferencia entre mayúsculas y minúsculas.
find  /home/vacaciones/ -name "*.jpg": encuentra todos los ficheros con extensión .jpg que hay en el directorio /home/vacaciones.
find  /user -type f: encuentra todos los ficheros de tipo ordinario (parámetro "f") habidos dentro del directorio /user.
find / -user pedro: encuentra todos los archivos y directorios pertenecientes al usuario pedro.
find / -name cosas: encuentra el archivo cosas buscando a partir de la raíz del sistema. 
find . -name "hola.txt": encuentra todos los archivos de nombre hola.txt buscando a partir del directorio actual.
find . -size 50k: busca archivos que ocupen 50k a partir del directorio actual.
find . -size 20cbusca archivos que ocupen 20 bytes a partir del directorio actual. 
find . -size 5bbusca archivos que ocupen 5 bloques de 521 bytes cada uno a partir del directorio actual.
find / -empybusca archivos vacíos a partir del directorio raíz.
find /home/user1 -name \*.binbusca archivos con extensión .bin dentro del directorio /home/user1.
find /usr/bin -type f -mtime -10: encuentra archivos binarios creados o cambiados dentro de los últimos diez días.
find /usr/bin -type f -atime -100: encuentra archivos no usados dentro de los últimos diez días. 
Como ven las posibilidades son enormes (aún más si añadimos expresiones regulares o tuberías) y las variantes multitud. Acudan a las opciones de ayuda habituales y a internet para ampliar conocimientos. 

locate
Comando similar a find que realiza sus búsquedas conforme a una base de datos indexada (localizada en el archivo /var/lib/mlocate.db)  en lugar en relación al contenido del sistema. Su funcionamiento es en esencia igual.
locate -e archivo: busca solamente entradas de archivos existentes.
locate -i archivo: igual que la anterior pero ignorando la diferencia entre mayúsculas y minúsculas.
locate /home/*.txt: busca los archivos con extensión .txt en la ruta /home
whereis
Sirve para localizar un archivo binario (ejecutable), el código fuente y la página del manual de un comando.
whereis -b: busca solo el archivo binario.
whereis -m: busca solo la página del manual.
whereis -s: busca solo el código fuente.
whereis -b halt: muestra la ubicación del fichero binario correspondiente al comando halt.
which
Encuentra donde se está ubicado un archivo binario siempre que su ruta esté incluida en la variable PATH.

Y buscando algo con que ilustrar el comando find he encontrado este tema de Clannad llamado "I will find you" que aparecía en la banda sonora de "El último mohicano".



sábado, 7 de diciembre de 2013

Filtrar datos y archivos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

En ocasiones será necesario recurrir a comandos que nos ayuden a localizar archivos binarios (ejecutables), paquetes, simples ficheros de trabajo o determinados contenidos dentro de ellos. Hoy vamos a hablar de algunas órdenes que nos ayudarán en la tarea de filtrar los resultados deseados ya sea en la búsqueda de ficheros o de sus datos.

grep
Conviene aprender bien como opera este comando ya que nos resultará muy útil para encontrar cadenas de texto dentro de ficheros, lo cual conviene cuando son extensos. Es básicamente un filtro que concreta la búsqueda en función del argumento que le acompañe. Algunas de sus opciones son:
grep -i: para no distinguir entre mayúsculas y minúsculas.
grep -n: muestra el nº de línea dentro de un archivo especificado según el patrón introducido.
grep -v: muestra las líneas no coincidentes con el patrón especificado.
grep -c: en lugar de mostrarlas líneas coincidentes con el patrón introducido muestra el número de líneas que coinciden.
grep -r: busca recursivamente dentro de los subdirectorios existentes en el directorio actual.
grep -o: para que en el listado solo aparezca la parte de la línea que coincide con el patrón.
Para entender la potencia de este comando conviene que veamos algunos ejemplos:
grep opciones docu.txt: para listar todas las líneas que contengan la cadena "opciones" dentro de docu.txt.
grep "expresiones regulares" docu.txt: para listar todas las líneas que contengan la cadena "expresiones regulares" dentro de docu.txt. Cuando se trate de dos o más palabras hay que entrecomillarlas.
grep -v "compras" departamentos.txtpara excluir del listado todas las líneas que contengan la cadena "compras" dentro de departamentos.txt.
grep guitarra dredg anathema dreamtheater rush > guitarras.txt: nos envía las líneas que contengan la palabra "guitarra" de los archivos dredg, anathema, dreamtheater y rush al archivo guitarras.txt.
grep guitarra dredg anathema dreamtheater rush | tee guitarras.txt: visualiza el mismo resultado que anteriormente por pantalla y, a través de una tubería, usamos el comando tee para enviarlo al archivo guitarras.txt.
sed
Comando que permite borrar líneas y registros o sustituir cadenas de caracteres dentro de las líneas. Estas modificaciones solo se dan a efectos de visualización y los archivos originales no se ven alterados salvo que utilicemos el comando de una manera muy concreta.
sed "3d" lista.lst: elimina la línea nº 3 del archivo lista.lst.
sed "3,5d" lista.lst: elimina el rango de líneas de la 3 a la 5 del archivo lista.lst.
sed "3,$d" lista.lst: elimina el rango de líneas de la 3 en adelante del archivo lista.lst.
sed "/^$/d" lista.lst: elimina las líneas en blanco del archivo lista.lst. 
sed "s/cadena1/cadena2/g" lista.lst: sustituye cadena1 por cadena2  en el archivo lista.lst.
sed "5 s/USUARIO/usuario/g" lista.lst: sustituye USUARIO por usuario en la línea nº 5 del archivo lista.lst. 
sed -i "3,5d" lista.lst: mismo efecto que el anterior, pero esta vez los cambios se realizan en el archivo.
sort
Comando para ordenar registros y líneas de uno o más archivos.
sort listado.txt: ofrece por pantalla las líneas del archivo listado.txt  ordenadas por orden alfabético.
sort listado.txt >  listado2.txt: crea un duplicado de listado.txt con nombre listado2.txt y con sus líneas ordenadas alfabéticamente.
sort -o listado.txt listado.txt: ordena las líneas del archivo sin ofrecerlo por pantalla.
sort -r listado.txt: muestra por pantalla las líneas del archivo ordenadas en orden inverso.
sort -n listado.txt: ordena las líneas por número; útil cuando dichas líneas comienzan con un carácter numérico.
sort -u salida.txt: elimina las líneas repetidas al ordenar el archivo salida.txt
sort -m lista1.txt lista2.txt: combina ambos archivos asumiendo que los dos están previamente ordenados.
sort -b: ignora los espacios en blanco. 
tr (translate)
Permite cambiar unos caracteres por otros dentro de un archivo. Primero especificamos lo que vamos a sustituir y seguidamente lo que lo sustituye. Escribamos su sintaxis y la aclararemos después con ejemplos:

tr [opción] SET1 [SET2].

Las opciones pueden ser
-d: elimina los caracteres incidados en SET1.
-s: elimina o reemplaza los caracteres indicados en SET1. 
-c: todos los caracteres que no estén indicados en SET1 los convierte a SET2.
-t: trunca la longitud de SET1 a la de SET2.
Veamos algunos ejemplos:
echo ejemplo | tr -d emp: elimina los caracteres emp de la palabra ejemplo. Aquí ejemplo sería SET1 y emp sería SET2.
echo ejjemmpplo | tr -s [a-zA-Z]: elimina cualquier letra (representada por la expresión comodín [a-zA-Z]) duplicada de la palabra ejjemmpplo.
echo "nací el 02 de enero de 1947" | tr -c [0-9] $: sustituye todo carácter no numérico (incluidos espacios en blanco -de nuevo ver comodines-) de la expresión "nací el 02 de enero de 1947" por el carácter $.
echo murcielago | tr aeiou AEIOU: lo que aquí decimos es que de murcielago cojamos las letras aeiou y las sustituyamos por AEIOU.
Como vengo insistiendo, esto no son más que pequeños ejemplos. Documentarse y practicar es la mejor receta para aprovechar las prestaciones de estos comandos.

Y como no podría ser más a propósito, ya que hemos hablado de filtros terminemos con un vídeo de la banda de Cleveland Filter y este potente "Welcome to the fold".



sábado, 23 de noviembre de 2013

Redirección de comandos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Hoy vamos a conocer como redireccionar el resultado de un comando hacia la pantalla o hacia un archivo. Se emplean unos caracteres llamados operadores de redirección o redireccionadores para enviar el resultante de la ejecución de un comando al lugar donde nos interesa tenerlo.

Lo primero a tener claro es que los procesos en GNU/Linux tienen asociados tres archivos ubicados en el directorio /dev y denominados:

/dev/stdin o entrada estándar
/dev/stdout o salida estándar
/dev/stderr o salida de errores

La entrada estándar o stdin es el lugar desde donde un comando obtiene la información a procesar, y por defecto es el teclado.

La salida estándar o stdout es el lugar donde un comando envía el resultado de su ejecución, y por defecto es la pantalla del terminal.

La salida de errores o stderr es el lugar donde un comando envía un mensaje de error en caso de que se produzca; por defecto es la pantalla pero también puede ser un archivo.

Cada uno de estos tres archivos lleva también asociado un número descriptor:

stdin - 0
stdout - 1
stderr - 2

Luego están los operadores, que son los símbolos < y >. Con estos caracteres realizaremos la operativa de redirección. Resumiendolo en una tabla:
  1. stdin  -  entrada estándar (teclado)  - Descriptor: 0  - Operador: <
  2. stdout  -  salida estándar (terminal)  - Descriptor: 1  - Operador: >
  3. stderr  - salida de errores (pantalla o archivo)  - Descriptor: 2  -  Operador: >
Para entender todo esto lo mejor es verlo con ejemplos.

Imaginemos que queremos enviar la salida de un comando a un fichero para verlo con posterioridad, por ejemplo, el listado del contenido de nuestro directorio actual (comando ls -l) al archivo lista.txt. Lo haríamos así:
1) De salida estándar stdout (pantalla) a archivo -1er caso-: ls -l > lista.txt
Así, en lugar que ver el resultado del comando ls -l por pantalla obtendríamos un archivo llamado lista.txt en el que aparece el contenido de nuestro directorio actual según los términos del comando ls -l. Si este archivo ya existiera lo sobreescribiría. Veamos más ejemplos.
2) De salida estándar stdout (pantalla) a archivo -2º caso-: ls -l >> lista.txt
En este caso el redireccionador es >> y lo que conseguimos con él es añadir el resultado del comando ls -l al archivo lista.txt ya existente. Podemos así añadir contenido al archivo repetidas veces si no queremos crear uno nuevo cada vez o machacar el ya existente.
3) De error estándar stderr a archivo (1er caso): ls -l 2> errores.txt
Habrá ocasiones en que un comando nos de error al ejecutarse, total o parcialmente, y en esa ocasión quizá sea útil ver pausadamente en qué consiste ese error. Para eso está la salida de errores y lo más común es derivarla a un archivo, en este caso errores.txt. Recuerden que si ya existe lo sobreescribirá. Si no se produce ningún error el archivo se creará sin contenido alguno. No saldrá nada por pantalla.
4) De error estándar stderr a a archivo (2º caso)ls -l 2>> errores.txt
Mismo caso que el que vimos más arriba; si el redireccionador es doble lo que hacemos es añadir contenido al archivo de errores designado (que sigue siendo errores.txt). Tampoco saldrá nada por pantalla.
5) De error estándar stderr a la salida estándar stdout (pantalla): cp * 2>&1
En esta ocasión usando los descriptores hemos redireccionado la salida de error del comando cp * (copiar todo) a la salida estándar (la pantalla) mediante el carácter &. De esta forma si no es posible copiar todo lo designado con el comando cp por el motivo que sea (como puede ser no tener privilegios para hacerlo) los mensajes de error serán visualizados por la salida estándar (pantalla).
6) De un archivo al comando por la entrada estándar stdin (teclado): grep "López" < empleados.txt
Aquí hemos empleado el comando grep, el cual sirve para filtrar resultados en función del parámetro introducido, que ha sido "López". De este modo, dentro de un hipotético archivo llamado empleados.txt se han buscado todas las líneas de texto que contengan "López" y el resultado de esta búsqueda se ha enviado a la salida estándar (pantalla). Dicho de otro modo, el resultado de la búsqueda se emplea como entrada del comando grep y el resultado de su ejecución lo vemos por la pantalla.
7) De error estándar stderr a dispositivo nulo: ls -l 2> /dev/null
De esta forma los errores producidos al ejecutar el comando ls -l irán a un dispositivo nulo y se perderán.
8) De salida estándar stdout a dispositivo nulo: ls -l > /dev/null
No hay mucho más que explicar de este caso: el comando se ejecuta y su resultado se pierde por el agujero negro de la salida nula.

Como siempre digo, conviene consultar toda la documentación que cada uno tenga a mano para completar y terminar de entender el concepto de redirección. Y practicar, practicar mucho.

Parece que la ocasión la pintan calva para engarzar un vídeo de One Direction, ¿verdad? Pues lo siento, se van a quedar con las ganas. Ahí tienen a la extinta formación post-metalera Isis que, digamos, transitaron por senderos ligeramente dispares.



sábado, 9 de noviembre de 2013

Más comandos para operar con archivos y directorios

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Ya hemos hablado de como trabajar con archivos y directorios pero no es posible condensar todo el material que bajo ese título podría caber sin convertir la entrada en interminable. De tal modo, nuevamente vamos a vernos las caras con mandatos de terminal que nos ofrecen distintas prestaciones según la tarea que estemos realizando.

alias
Este comando ya fue tratado en el blog para un ejemplo concreto, pero no quiero que se quede fuera del tratamiento general que es la tónica del blog. Sirve para crear un atajo a un comando fijándole un nombre.
alias -a: elimina las definiciones de alias en el entorno de ejecución actual.
alias -p: muestra la lista de alias existente en el archivo .bashrc con el formato nombre_alias=valor.
alias instalar="sudo apt-get install":  crea un atajo para el comando sudo apt-get install llamado instalar.
alias lhost="cd /var/www/html": crea un atajo de acceso al directorio /var/www/html/ llamado lhost.
/comando_alias: tecleado de esta manera, en caso de invocar un alias cuyo nombre coincida con el de otro comando, no se tiene en cuenta dicho alias.
~/.bashrc: archivo oculto donde se incluyen los alias que deseamos que se vuelvan permanentes. 
unalias
Sirve para eliminar un alias existente.

ln
Comando para crear enlaces a archivos. Hay enlaces dos tipos de enlaces: duros y simbólicos. El enlace duro es un duplicado del archivo al que enlaza pero con otro nombre. Comparte inodo (estructura de datos que conserva cada archivo) con el original por lo que no pueden crearse en particiones o unidades distintas. El enlace simbólico funciona como un acceso directo de Windows, tenga o no el mismo nombre. Pueden crearse al margen de la unidad o partición donde se encuentren.
ln archivo1 archivo2: crea el enlace duro archivo2 a partir de archivo1.
ln -s archivo1 archivo2: crea el enlace simbólico archivo2 a partir de archivo1.
stat
Comando que muestra una serie de datos precisos acerca de un archivo o un directorio como nombre, tamaño, bloques que ocupa, tipo de archivo, inodo, enlaces, ID, GUID, propietario, grupos y fechas de acceso y modificación.

file
Comando simple que nos informa de si un objeto es un directorio o un archivo, y de qué tipo si es lo segundo.

cmp
Compara dos archivos y nos dice si son o no distintos. Nos informa en qué número de línea está la diferencia.

diff
Compara dos archivos línea a línea y nos dice las diferencias, algo que resulta más útil cuando se trata de archivos de texto.

wc
Cuenta las líneas, palabras y caracteres de un archivo.
wc -c: muestra solo el número de caracteres.
wc -w: muestra solo el número de palabras.
wc -l: muestra solo el número de líneas.
alien
Este comando no siempre viene por defecto en nuestra distribución por lo que, en tal caso, hay que instalarlo si lo queremos usar. Sirve para convertir paquetes de software de, entre otros, formato .deb (Debian), .rpm (Red Hat) y .tar.gz (Slackware).
alien -d archivo.rpm/tar.gz: para generar un paquete .deb a partir de un .rpm o un .tar.gz. (opción por defecto).
alien -t archivo.deb/rpm: para generar un paquete .tar.gz a partir de un .deb o un .rpm.
alien -r archivo.deb/tar.gz: para generar un paquete .rpm a partir de un .deb o un .tar.gz.
Nuevamente les recuerdo que solo una pequeña muestra de las opciones existentes son las mostradas aquí. Acudan a la ayuda del terminal para recabar más información.

Y como hemos hablado del comando alien, nada más apropiado que evocar el trailer original de 1979 de la mítica película de Ridley Scott.