educatica!

educación, informática y demás

GNU/Linux bash, Informática, Sistemas operativos

Jugando con tuberías

En esta entrada vamos a jugar un poco con las tuberías en un sistema GNU/Linux con bash. En concreto con Ubuntu 18.04 Desktop.

El objetivo es mostrar la utilidad del uso de tuberías para encadenar la ejecución de varios comandos obteniendo un resultado complejo compuesto por el trabajo conjunto de todos los comandos.

1. Muestra la línea de configuración del usuario alumno.

Hemos utilizado el comando grep que es un filtro. Este comando mostrará las líneas en las que aparezca la cadena de texto o patrón que le pasemos como parámetro en la entrada que reciba. Como todos los filtros, podemos decidir pasarle datos por la entrada estándar usando una tubería o bien pasarle un fichero.

En el caso anterior, con fines didácticos, hemos optado por usar una tubería, pero podríamos haberle pasado el fichero /etc/passwd como parámetro a grep y nos hubieramos ahorrado ejecutar cat.

2. Muestra la línea de configuración del usuario alfredoff

3. Muestra las líneas de configuración de las cuentas de usuario que tengan su directorio personal dentro del directorio /home.

La ayuda para realizar esta actividad sería conocer que en cada línea del fichero de configuración de cuentas de usuario se almacena la ruta del directorio personal de cada usuario como un campo más.

De esta forma, si filtramos todas las entradas almacenadas en el fichero /etc/passwd buscando la ruta /home, estaremos mostrando todas las cuentas de usuario que almacenan su directorio personal en /home.

5. Muestra las cuentas de usuario que usen como interprete de comandos /bin/false.

Existen cuentas de usuario que utilizan este interprete de comandos, que en realidad no hace nada. Se trata de una forma de evitar que estas cuentas inicien sesión en el sistema en modo consola de comandos.

6. Muestra las cuentas de usuario que usen como interprete de comandos /bin/bash.

Si nos fijamos, en este caso, las cuentas de usuario que se muestran son de usuarios que hemos ido creando en nuestro sistema a lo largo de las prácticas junto con la cuenta root.

6.1 – Muestra las cuentas de usuario que no usen como interprete de comandos /bin/bash.

Ahora tendriamos que hacer una selección inversa, es decir que se muestren las líneas en las que no aparece la cadena de texto o el patrón que le pasamos al filtro grep. Como no sabemos que opción utilizar, tendremos que consultar la página de manual de grep.

Vamos a usar la opción -v para invertir la correspondencia.

6.2 – Vamos a contar el número de cuentas de usuario que utilizan un interprete de comandos distinto del /bin/bash.

En la pregunta anterior hemos mostrado en pantalla todas las líneas del fichero /etc/passwd que no contienen el shell /bin/bash. Ahora queremos contar el número de líneas. Para ello utilizaremos el comando wc. Como no sabemos utilizarlo, deberíamos consultar su página de manual.

La opción que debemos usar para contar las líneas es -l.

Así pues, lo único que tenemos que hacer es añadir este comando, este filtro, a las tuberías para contar el número de líneas.

También podríamos haber utilziado la opción -c del comando grep para contar las líneas.

6.3 Muestra las últimas cinco cuentas de usuario que no usen como interprete de comandos /bin/bash.

Ahora nos piden que de todas las cuentas de usuario que no utilizan la shell /bin/bash solo mostremos las cinco últimas. Para ello utilizamos el filtro tail.

7. Muestra las cuentas de usuario que usen como interprete de comandos /bin/bash, pero ordenando alfabéticamente la salida.

Seguro que hay un comando que ordena… este comando es sort. Si no sabemos utilizarlo, deberíamos consultar su página de manual con el comando man.

El comando sort esun filtro, al igual que grep. Se trata de un comando que ordena lo que lee por entrada, que puede ser un fichero o los datos que le vengan de la entrada estándar.

Por defecto ordena las líneas en base a lo que lee en cada una de ellas, comenzando por el inicio de la línea. Se pueden usar distintas opciones para especializar su resultado.

Conociendo este comando, ahora nos faltaría ordenar la salida obtenida en el comando anterior.

8. Muestra las cuentas de usuario que usen como interprete de comandos /bin/bash, pero ordenando alfabéticamente la salida en orden inverso.

Lo primero que tenemos que hacer es leer la ayuda para buscar que opción nos ordenará de forma inversa.

Así que el comando sería el siguiente

9. Almacena en un fichero llamado usuarios.log la información de las cuentas de usuario del sistema que utilicen /bin/bash como interprete de comandos ordenadas alfabéticamente.

En realidad lo que nos están pidiendo es que obtengamos la misma información que teníamos que mostrar en la pregunta 8, solo que ahora tenemos que guardarla en un fichero.

Por tanto tan solo tendríamos que aprovechar el comando anterior y utilizar una redirección para guardar los datos en un fichero.

10. Muestra información de las cuentas de grupo de las que sea miembro el usuario alfredoff, aparte de su grupo principal.

Aqui la primera traba es conocer dónde se guarda la información de cuentas de grupo del sistema. El fichero que almacena esta información /etc/group.

Podríamos pensar en utilizar grep con el nombre del grupo y estaría casi bien.

El problema, es que nos encontramos con un grupo que se llama como el usuario. Muy posiblemente, por como hemos estado trabajando con el sistema, ese grupo sea el grupo principal del usuario alfredoff, pero no podemos asegurarlo.

11. Muestra solo la línea de configuración de la cuenta del grupo llamado alfredoff.

Con lo que sabemos ahora mismo podríamos mostrar todas las líneas del fichero que contengan la cadena alfredoff. Sin embargo, buscamos aquella línea que tenga la cadena alfredoff al inicio y no en ningún sitio más.

Si no sabemos como filtrar esta información con grep, deberíamos consultar su página de manual.

Esto viene a decir que, podemos utilizar los metacaracteres ^ o $ para indicar que delante de la cadena no hay ningún caracter (^) o que después de la cadena no hay ningún caracter.

¿Qué significa eso?. Si delante de una cadena de texto que estamos bucando con grep indicamos que no puede haber ningún caracter, significa que delante de esa cadena en la línea no puede haber nada, por tanto debe ser el principio de la línea.

De la misma forma, el $ indica que detrás del patrón o cadena con la que estamos buscando con grep no puede haber nada más. Por tanto, debe ser la última cadena de caracteres en la línea.

Por tanto, si queremos mostrar solo las líneas que comiencen por la palabra alfredoff tendríamos que pasarle al grep ^alfredoff. Esto le indica al comando que solo se cumple la correspondencia con alfredoff si delante de esa cadena de texto no hay nada, por tanto está al principio de la línea.

Por ejemplo, en alguna pregunta anterior cuando nos pedían que mostraramos las líneas de las cuentas de usuario que utilizaban la shell /bin/bash no utilizabamos el metacaracter $ para indicar que la cadena /bin/bash tenía que aparecer al final.

La solución mejor sería la siguiente.

12. Muestra el nombre de las cuentas de usuario que utilicen como shell /bin/bash. Solo el nombre de la cuenta, nada más.

Con el comando anterior, mostramos todas las líneas de las cuentas de usuario que tienen como shell /bin/bash. Sin embargo nos piden que solo mostremos el nombre de la cuenta.

Resulta que el nombre de la cuenta es el primer campo de cada registro de cuentas de usuario. Sabemos que el caracter : es el que separa cada campo, porque lo hemos leido en la página de manual del fichero /etc/passwd (man 5 passwd).

Está claro que necesitamos filtrar la salida. Este comando que nos va a permitir cortar porciones de cada línea del fichero o de la entrada que le proporcionemos es el comando cut. Como grep y sort es un filtro. Podemos obtener información sobre su uso consultando su página de manual con el comando man.

Podemos leer las opciones disponibles para comprobar como especializar su funcionamiento. Nos vamos a detener en las opciones -d y -f

En la opción -f nos indica que podemos pasarle una lista (LIST). Si seguimos leyendo, más abajo, nos indicará como usar la lista.

Nosotros en este caso, tan solo queremos mostrar el campo número 1 de un fichero que utiliza como delimitador el caracter :.

13. Muestra solo el nombre de usuario y el uid de las cuentas de usuario que utilicen como shell /bin/bash.

Queremos los campos 1 y 3, así que especificamos estos campos separados por comas en la opción -f del comando cut.

14. Muestra solo el nombre de usuario y la ruta del directorio personal de las cuentas de usuario que utilicen como shell /bin/bash.

De nuevo lo que tenemos que determinar es el número de los campos a mostrar.

14.1 Muestra solo el nombre de usuario y la ruta del directorio personal de las cuentas de usuario que utilicen como shell /bin/bash, pero sin mostrar el delimitador :. En su lugar, queremos un espacio.

Para ello utilizaremos el comando tr, que permite traducir o sustituir letras o cadenas por otras. Como no sabemos utilizarlo, deberíamos consultar su página de manual.

15. Muestra la lista de usuarios que son miembros del grupo ventas. Asegurate de que el grupo sea ventas.

Para asegurarnos de que el grupo es ventas, deberíamos utilizar los metacaracteres. En este caso el ^ para que la línea del fichero se seleccione solo si ventas aparece al principio.

16. Muestra los interpretes de comandos que utilizan los usuarios de tu sistema.

El interprete de comandos o shell que utiliza una cuenta de usuario se almacena en el último campo de cada registro de cuenta de usuario que se almacena en /etc/passwd.

Hemos aprendido a cortar información de cada línea de un fichero. Podríamos seleccionar solo el último campo, el campo número 7, de cada línea del fichero /etc/passwd.

Sin embargo, la salida que se proporciona no está tan limpia como esperamos. Hay muchas entradas repetidas, como es lógico.

Lo que nos gustaría es que no se repitieran interpretes de comando, puesto que queremos una lista de los que se utilizan.

Podemos utilizar uno de estos dos comandos, o los dos uniq o sort.

Si utilizamos uniq tenemos que ordenar antes la lista de resultados, puesto que uniq quitará los resultados repetidos siempre y cuando estén adyacentes, es decir seguidos. Así que primero tendríamos que ordenar y después pasarle el comando uniq.

Con sort y la opción -u obtenemos el mismo resultado, porque sort ordena y con la opción -u le indicamos que quite los resultados repetidos.

17. Muestra los mensajes de error almacenados en el fichero de log del sistema. Se considera error aquella línea que contiene la cadena de texto error.

Lo primero que necesitamos saber es dónde está el fichero de log del sistema. La ruta del fichero es /var/log/syslog.

18. Muestra solo el último mensaje de error almacenado en el fichero de log del sistema. Se considera error aquella línea que contiene la cadena de texto error.

Usamos el comando tail para mostrar la última línea.

19. Muestra solo el primer mensaje de error almacenado en el fichero de log del sistema. Se considera error aquella línea que contiene la cadena de texto error.

20. Muestra información de procesos que se estén ejecutando en alguna terminal virtual.

Lo primero que deberíamos saber es como mostrar todos los procesos en ejecución en el sistema. Para ello utilizamos el comano ps con la opción -A.

Por curiosidad vamos a contar los procesos que tenemos en ejecución actualmente. Para ello utilziaremos el comando wc con la opción -l en una tubería.

De toda la lista de procesos queremos mostrar solo la información de los procesos que se estén ejecutando en un terminal virtual. Cuando cambiamos a una terminal virtual, por ejemplo la número 6 se muestra información sobre la terminal en la que estamos. Esta información es una cadena de texto como sigue tty6.

Podriamos utilizar la cadena de texto tty como discriminador de los procesos que se están ejecutando en alguna terminal virtual.

21. De los ficheros contenidos en tu directorio actual, se desea mostrar los permisos, propietario, grupo y nombre del fichero.

Vamos a utilizar el comando ls con la opción -l para obtener información extendida de ficheros del directorio actual. Con esa salida, tendremos que filtrarla para mostrar solo la información que nos piden.

Sin embargo, tendremos problemas con los espacios que se utilizan para separar cada campo. Así que tendremos que utilizar el comando tr para ajustar un poco los espacios usando la opción -s de squeeze (comprimir).

Tendremos que convertir varios espacios adyacentes en un solo espacio para que funcione correctamente el comando cut.

22. Muestra los permisos del propietario del fichero usuarios.log

Podemos mostrar toda la información extendida del fichero usuarios.log con el comando ls y la opción -l.

De toda esa información, solo queremos los tres caracteres seleccionados en la imagen. Para ello utilizaremos el comando cut, pero esta vez no seleccionaremos campos, sino caracteres de la entrada estándar.

Deja un comentario

Tema creado por Anders Norén