educatica!

educación, informática y demás

Clases de informática, GNU/Linux bash, Informática, Sistemas operativos

Comandos GNU/Linux

A lo largo de este caso práctico vamos a resolver una serie de acciones que nos solicitarán utilizando comandos de GNU/Linux. Vamos a trabajar con una serie de cuentas de usuario, que debemos crear en nuestro sistema, y de grupos.

  • Usuario: anagp, rosama, manueljp y soniaba.
  • Grupos: informatica

1. Creamos la cuenta del usuario anagp.

2. Creamos la cuenta de usuario rosama

3. Creamos un nuevo usuario llamado manueljp.

4. Ahora vamos a mostrar la información de configuración que se guarda en el sistema para estas tres cuentas de usuario. Para ello, mostraremos las tres últimas líneas del fichero /etc/passwd que es el que almacena la información de configuración de cuentas de usuario en el sistema GNU/Linux Ubuntu.

5. Cualquier usuario puede leer este fichero, Vamos a mostrar las tres últimas líneas como usuario normal, sin utilizar sudo.

6. Vamos a mostrar las cinco últimas líneas del fichero que almacena las cuentas de grupo del sistema.

7. Vamos a mostrar los permisos de este fichero.

8. Las contraseñas de las cuentas de usuario del sistema se guardan en otro fichero por motivos de seguridad. Este fichero es /etc/shadow. Vamos a ver los permisos que tiene este fichero /etc/shadow

Los usuarios normales no pueden leer de este fichero ni escribir O:). El único usuario que podrá gestionarlo es root.

Un recordatorio, aunque root no tenga explicaitamente permisos en un fichero, root puede hacer lo que quiera en el sistema. Muchas veces se utiliza como propietario root o como grupo root para configurar los permisos de un fichero o directorio cuando no se quiere configurar un usuario propietario o un grupo a un fichero. Al poner a root en uno de estos campos, estamos rellenando la información necesaria y no alteranmos los permisos de dicho fichero, porque, repito, root puede hacer lo que quiera, siempre.

9. Vamos a mostrar las tres últimas líneas del fichero /etc/shadow. Para ello tendremos que utilizar el comando sudo.

Aparecen las contraseñas cifradas de cada cuenta de usuario mostrada en pantalla. Cada línea, al igual que en /etc/passwd, almacena información de una cuenta de usuario. En este caso, almacena información de las controaseñas de cuentas de usuario en el sistema. Cada línea contiene una serie de campos separados por «:».

10. Vamos a mostrar el contenido del directorio /home.

11. Vamos a motrar información de permisos de estos directorios.

Por defecto, la configuración de permisos de los directorios personales de los usuarios, como ya hemos visto cuando trabajamos permisos en modo gráfico, permite a otros usuarios acceder a los directorios personales de cualquier usuario para realizar operaciones de lectura.

Esto tiene su lógica si queremos compartir información, pero deja los directorios personales con una configuración no confidencial.

12. Vamos a cambiar los permisos de todos los directorios personales almacenados en /home para que solo el propietario y el grupo puedan acceder con los permisos que ya tienen, pero el resto de usuarios no podrá acceder a dichos directorios personales. Para ello vamos a utilizar el comando chmod y los modos en octal, puesto que propietario y grupo tienen los mismos permisos.

Cuidado al escribir la ruta de los ficheros a los que les vamos a cambiar los permisos. Si hubieramos escrito /home en lugar de /home/* estaríamos cambiando los permisos del directorio /home no de su contenido.

13. Vamos a añadir un nuevo grupo al sistema que se llame informatica.

14. Mostramos la última línea del fichero de cuentas de grupo del sistema.

15. Vamos a añadir las cuentas de anagp, rasama y manueljp al grupo informatica.

Tenemos que ejecutar el comando adduser con cada usuario a añadir al grupo informatica.

16. Vamos a mostrar información de identificación de cada uno de los usuarios usando el comando id.

17. Vamos a mostrar la última línea del fichero de cuentas de grupos.

Podemos observar la lista de usuarios que son miembros del grupo informatica en el último campo de la línea del grupo informatica. Los nombres de usuario miembros del grupo están separados por una coma.

La configuración de los sistemas GNU/Linux se suele almacenar en ficheros de texto plano que se podrían editar con un editor de textos, aunque no es recomendable, salvo que sepamos lo que estamos haciendo.

18. Vamos a ver como podemos cambiar la configuración del grupo tocando el fichero /etc/group con el editor de textos nano.

Primero, vamos a mostrar información de nuestra cuenta de usuario con el comando id.

Editamos el fichero /etc/group

Nos vamos a la linea de informatica. Esta es la pinta que tiene

Vamos a borrar a manueljp y vamos a añadir al usuario javier.

Cuando guardemos el fichero, bien pulsando CTRL+O o bien saliendo y guardando con CTRL+X habremos sacado a manueljp del grupo informatica y habremos añadido al usuario javier al grupo informatica.

Los cambios han surtido efecto y solo hemos modificado un fichero de texto plano. Este tipo de modificaciones no son recomendables hacerlas a mano por el administrador, salvo que no quede más remedio y sepas lo que estás haciendo.

19. Vamos a quitar al usuario javier del grupo informatica utilizando el comando deluser. Estos comandos de gestión de usuarios lo que hacen es modificar estos ficheros de configuración pero de forma controlada.

Vamos a comprobar que ha funcionado.

20. Vamos a añadir de nuevo a manueljp al grupo informatica con el comando adduser.

Ahora, para facilitar que estos usuarios puedan intercambiar información unos con otros, vamos a cambiar el grupo de los directorios personales de estos tres usuarios.

21. Cambia el grupo de los directorios personales de los usuarios rosama, anagp y manueljp para que el grupo sea informatica. Para ello utilizaremos el comando chgrp.

Hemos utilizado las llaves para evitar tener que escribir tres veces una ruta larga, aprovechando las expresiones regulares. Con la configuración actual cualquier usuario de educatica puede acceder a los directorios personales de sus compañeros para realizar operaciones de lectura.

22. Vamos a crear un directorio llamado informatica dentro del directorio raiz.

23. Antes vamos a echar un vistazo a los permisos del directorio raíz, no de su contenido. Para ello utilizamos la opción -ld del comano ls, para que muestre información del directorio en sí, no de su contenido.

24. Vamos a crear el directorio, con el comando sudo puesto que root es el único usuario que puede escribir.

Vamos a echar un vistazo a los permisos del directorio no de su contenido.

El propietario es root y el grupo root. Esto es así puesto que el usuario que ha creado el directorio es root. El sistema le ha asignado como propietario el usuario que ha realizado la acción y como grupo su grupo primario.

25. Ahora vamos a cambiar el propietario y el grupo de este directorio. Como propietario vamos a poner a rosama y como grupo informatica.

Según los permisos cualquier usuario puede acceder al directorio para realizar operaciones de lectura. El único usuario que podrá realizar operaciones de escrigura es el usuario rosama, que es el propietario.

26. Queremos que tan solo los miembros del grupo informatica y rosama puedan acceder a este directorio, con los permisos que tienen actualmente. Los otros no deberían poder acceder.

Tenemos que quitar los permisos de los otros. Vamos a utilizar el comando chmod. Podríamos utilizar los modos en octal, sin embargo vamos a utilizar los modos simbólicos.

27 Vamos a crear los directorios develop, design y admin dentro del directorio /informatica.

28. Vamos a cambiar el grupo de los directorios recién creados para que pertenezcan al grupo informatica.

El problema está en que el *, que es un patrón que hace referencia a todo lo que hay en el directorio /informatica, se trata de resolver con el usuario javier, que no tiene permiso de acceso a dicho directorio. Para poder utilizar el * en este caso tendremos que cambiarnos a usuario root.

Para cambiar de usuario utilizamos el comando su, en este caso como queremos cambiarnos a root vamos a utilizar sudo su.

Si nos fijamos, el prompt del sistema ahora nos indica que el usuario con el que estamos trabajando es root. También podemos verlo por la almohadilla que aparece junto al cursor, que indica que estamos trabajando como administrador o root.

29. Supongamos que queremos cambiar la contraseña del usuario anagp. Para ello utilizamos el comando passwd y el nombre de la cuenta de usuario para la que queremos cambiar la contraseña.

30. Vamos a cambiar el propietario del directorio admin para que el nuevo propietario sea rosama.

31. Vamos a cambiar el propietario del directorio design para que el nuevo propietario sea anagp.

32. Vamos a cambiar el propietario del directorio develop para que el nuevo propietario sea manueljp.

33. Vamos a cambiar los permisos del directorio /informatica y todo su contenido de forma que los otros, es decir el resto de usuarios que no son ni el propietario ni el grupo, no puedan acceder a nada, no tengan ningún permiso.

34. Vamos a dar permiso de escritura al grupo de todos los ficheros y directorios que estén dentro del directorio /informatica, pero no al directorio informatica.

35. Almacena en un fichero llamado raiz.txt en tu directorio actual el contenido del directorio raíz.

Vamos a utilizar las redirecciones. Vamos a utilizar la redirección simple para asegurarnos de que lo que habrá es el contenido del directorio raíz.

36. Renomabra el fichero raiz.txt a informacion.txt.

37. Añade al final del fichero la fecha y hora actual.

38. Intenta crear el directorio /datos con tu usuario actual, no uses sudo, redirige la salida de error al fichero errores.txt.

La salida de errores es la número 2, así que

39. Vamos a almacenar información de identificación de un usuario del sistema, en este caso de anagp. Queremos que la información de identificación del usuario que se guarde en el fichero usuarios.txt. Si el usuario no existe, no queremos que se muestre información de error en pantalla, sino que queremos que se guarden los mensaje de error en el fichero errores.txt, añdiéndolos al final.

40. Añade información de identificación del usuario pepe al fichero usuarios.txt. Si se produce algún error, añade el error al fichero errores.txt.

41. Añade información de identificación del usuario javierpm al fichero usuarios.txt. Si se produce algún error, añade dicho error también al fichero usuarios.txt.

Podríamos utilizar las dos redirecciones.

Pero podemos redirigar ambas salidas, la estándar y la de error, sobre un mismo fichero utilizando el ampersand & delante del símbolo de redirección.

42. Queremos ejecutar el comando ping -c1 8.8.8.8 sin que se muestre nada en pantalla. Así que redirigimos la salida estándar y la de error a un fichero. Sin embargo, esta salida no la queremos para nada, estaría bien poder redigir esa información a la basura. Para eso podemos utilizar el fichero /dev/null.

Podemos utilizar esta redirección de todo a un fichero basura. Esto se utiliza mucho en comprobaciones con el comando if cuando la condición es la ejecución de un comando. Como antesala de lo que veremos en shell scripts de bash, aquí tenéis el uso de esta redirección con el comando ping para que no muestre ningún mensaje.

43. Crea una variable llamada alumno cuyo contenido sea tu nombre de pila.

44. Muestra en pantalla el mensaje «Bienvenido al sistema usuario » seguido por el nombre del alumno.

Las variables las podemos utilizar en cualquier comando del sistema o aplicación. Lo que va a hacer el interprete de comandos cuando escribamos $ seguido del nombre de una variable es sustituir esa cadena de texto por el contenido de la variable.

45. Dentro del directorio /informatica crea un nuevo directorio con el nombre del usuario almacneado en la variable alumno.

Vamos a comprobar si se ha creado.

El propietario y el grupo es root.

46. Vamos a comprobar si existe un usuario con el nombre del alumno. Si no existe, crea un nuevo usuario con el nombre del alumno.

Para comprobar si existe utilizamos el comando id.

En mi caso, si existe la cuenta de usuario. Si no existiera podemos crearla con adduser de la siguiente forma.

47. Vamos a añadir el usuario almacenado en la variable alumno al grupo informatica.

48. Vamos a configurar el directorio con el nombre del alumno en el directorio /informatica para que el propietario sea el usuario almacenado en la variable alumno y el grupo informatica. Es decir, vamos a configurar el directorio de ese usuario alumno dentro del directorio informatica.

49. Configura el directorio del alumno para que los otros usuarios no tengan acceso de ningún tipo. Utilizamos el modo simbólico.

49. Asigna a la variable alumno el valor soniaba

50. Ahora repite todo el proceso que hemos realizado con alumno con el nuevo valor de la variable alumno.

Es decir, vamos a crear una cuenta de usuario, vamos a insertarla en el grupo informatica, vamos a crear un directorio con su nombre, vamos a configurar ese directorio para que pueda utilizarlo ese usuario y vamos configurar los permisos para que los otros no puedan acceder.

Como hemos utilizado una variable, tan solo tenemos que repetir exactamente los mismos comandos.

Si esto lo hubieramos guardado en un script no tendríamos que escribir tanto. Como ya sabemos un script es un programa escrito con comandos que se almacena en un fichero de texto plano. Sobre todo si tuvieramos que repetir este proceso con varios usuarios, está claro que deberíamos crear un script.

51. Muestra todos los procesos en ejecución en el sistema con el comando ps -A.

Como puedes ver hay muchos procesos, ¿qué hacemos si solo queremos mostrar los diez primeros?…

52. Muestra solo información sobre 10 primeros procesos en ejecución en el sistema.

En realidad tendríamos que haber puesto 11, puesto que la primera línea es la de encabezado.

53. Guarda la lista de los 10 primeros proceos que se están ejecutando actualmente en el sistema en el fichero procesos.txt.

54. Muestra en pantalla información de los procesos que se estén ejecutando en una tty. Para ello, utilza tuberías y el comando grep.

Lo ideal es consultar la ayuda del comando grep.

Grep analizará las líneas de texto que le lleguen por la entrada estándar o de un fichero y mostrará, por defecto, aquellas en las que aparezca el patrón indicado.

55. Con la ayuda de ps aux y el uso de tuberías, vamos a mostrar en pantalla solo los procesos ejecutados por el usuario javier.

Si nos fijamos, hay un proceso que no ha sido lanzado por javier, el primero que se muestra. Esto es así, puesto que grep busca la cadena javier en toda la línea.

Deberíamos decirle a grep que seleccione solo las líneas en las que aparezca al inicio de la línea la cadena de texto javier.

56. Añade al fichero procesos.txt la lista de los procesos ejecutados por el usuario javier.

57. Muestra la línea de configuración de la cuenta del usuario anagp.

Para ello podemos utilizar grep para seleccionar la linea exacta en la que se almacena información de la cuenta de usuario de anagp. Esta línea comenzará por la cadena de texto anagp.

58. Muestra la configuración de todos los usuarios que utilicen /bin/bash.

Podríamos haber utilizado el caracter dolar al final del patrón para indicarle a grep que solo seleccione las líneas que terminen con ese patrón.

59. Actualiza la lista de paquetes de software de tu sistema.

60. Instala el paquete de software gedit en tu sistema.

61. Lanza gedit abriendo el fichero creaUsuarios.sh lanzando gedit en segundo plano.

Al lanzar una aplicación o comando con un ampersand al final, lo que hace el interprete de comandos es ejecutar ese comando o aplicación en otro proceso nuevo.

El número que aparece es el PID del nuevo proceso.

62. Muestra información del proceso que esté ejecutando el programa gedit.

Vamos a utilizar tuberías para mostrar información solo del proceso que está ejecutando la aplicación o comando gedit. Para ello, mostramos toda la información de los procesos en ejecución en el sistema y pasamos esta salida al comando grep que la filtrará, mostrando solo las líneas en las que aparezca la cadena de texto gedit.

Si nos fijamos, el PID del proceso, el número que aparece a la izquierda, coincide con el número que se mostró al lanzar gedit en otro proceso.

63. Crea una nueva variable de entorno llamada usuario cuyo valor será manueljp.

64. Muestra en pantalla la cadena de texto «El usuario elegido es » seguida de el valor de la variable usuario.

65. Muestra el contenido del directorio personal del usuario almacenado en la variable usuario, con información extendida de permisos, propietario y grupo.

66. Muestra información de permisos del directorio personal del usuario, no de su contenido.

67. Crea una variable de entorno cuyo nombre será backup y su contenido será /backup/2021/febrero/01

68 . Crea el directorio de backups, cuya ruta está almacenada en la variable backup.

Vamos a comprobarlo, por ejemplo con tree

69 . Crea dentro del directorio de backups, cuya ruta está almacenada en la variable backup, un directorio para cada uno de los usuarios que hemos creado hasta ahora, es decir: anagp, rosama, manueljp y soniaba.

70 . Modifica el contenido de la variable backup para que la nueva ruta se /backup/2021/febrero/02.

71 .Vamos a crear el directorio de backups actual, , cuya ruta está almacenada en la variable backup.

Crea dentro del directorio de backups, cuya ruta está almacenada en la variable backup, un directorio para cada uno de los usuarios que hemos creado hasta ahora, es decir: anagp, rosama, manueljp y soniaba.

Como véis podemos sacar mucho partido de las variables en nuestros comandos, evitando tener que escribir muchas veces valores literales que nos pueden llevar a errores humanos.

Lo ideal sería usar esto en un script.. una aproximación podría ser la siguiente:

72 – Muestra las cinco primeras líneas del contenido del directorio raíz mostrando información de permisos propietario y grupo.

73 – Con la salida del comando anterior, vamos a mostrar información de los cinco primeros ficheros o directorios del contenido del directorio raíz, sin mostrar el total.

74 – Muestra en pantalla la línea de configuración de la cuenta del usuario anagp.

Sabemos mostrar el contenido completo del fichero que contiene las cuentas de usuario del sistema.

El siguiente paso sería filtrar toda esa información para quedarnos solo con la línea en la que aparezca el nombre de ese usuario.

75 – Muestra en pantalla la línea de configuración del grupo anagp.

Algo ha fallado, grep nos muestra aquellas líneas en las que aparece el patrón que hayamos especificado, en este caso anagp. La segunda línea es la cuenta de un grupo en el que anagp es miembro.

Sabemos el primer campo del registro de una cuenta de grupo es el nombre del usuario. Podríamos decirle a grep que solo muestre las líneas en las que aparezca el nombre del usuario al principio, y solo al principio.

76 – Busca información sobre un grupo en el sistema que se llame ana.

El problema está en que grep busca la cadena ana y el grupo anagp contiene esa cadena. Tenemos que indicar que queremos que aparezca la cadena exacta.

77 – Busca información sobre la cuenta del usuario almacenado en la variable usuario. Muestra la línea de configuración de dicha cuenta.

78 – Muestra en pantalla la ruta del directorio personal del del usuario almacenado en la variable usuario. Obtén la información del fichero de cuentas de usuarios.

El delimitador de campos es el caracter : y el campo que queremos es el 6.

Usando el comando cut podemos recortar y quedarnos solo con el campo número 6, indicando el separador «:»

79 – Muestra en pantalla el interprete de comandos del usuario almacenado en la variable usuario. Obtén la información del fichero de cuentas de usuarios.

81 – Muestra en pantalla el nombre del usuario, su UID y la ruta del directorio personal del usuario almacenado en la variable usuario. Obtén la información del fichero de cuentas de usuarios.

82 – Muestra en pantalla el nombre del usuario, su UID y la ruta del directorio personal del usuario almacenado en la variable usuario. Obtén la información del fichero de cuentas de usuarios, pero en lugar de los dos puntos, vamos a mostar espacios. Es decir, se deben traducir los «:» por espacios.

Vamos eso vamos a utilizar el filtro o comando tr. Vamos a traducir cada ocurrencia de «:» por » «.

83 – Almacena en una variable …

84 – Abre varias terminales en ventana y después muestra los procesos del sistema que estén ejecutando el comando bash.

85 – Termina con los procesos de las terminales que acabamos de abrir y que están ejecutando bash.

86 – Ejecuta, desde terminal, featherpad. Si estás trabajando con Ubuntu Desktop, ejecuta gedit.

Hasta que no se termine de ejecutar el programa que hemos lanzado, no podremos continuar interactuando con el interprete de comandos.

En cuanto cerremos el programa continua la ejecución bash.

87 – Ejecuta, desde terminal, featherpad, en un proceso nuevo. Si estás trabajando con Ubuntu Desktop, ejecuta gedit.

88. Mata todos los procesos que estén ejecutando featherpad. Utiliza el comando killall.

Deja un comentario

Tema creado por Anders Norén