100 UNIVERSIDAD DE COSTA RICA ESCUELA DE INGENIERÍA ELÉCTRICA IE-0117 Programación Bajo Plataformas Abiertas Profesor: Francisco Siles Canales Asistente: Félix Suárez Bonilla Estudiante: Christian Chaves Bejarano A81740 Laboratorio No. 2 El Shell de GNU/ Linux Primera Parte: Uso del Shell en GNU/Linux 1. Usando comandos conocidos, explore las funciones de autocompletado, historial y búsqueda de comando del Shell, así como las distintas formas de indicar nombre de archivos y directorios. 2. Explore el funcionamiento de las variables de entorno. Ejecute los siguientes comandos: $ echo $SALUDO $ SALUDO=hola $ echo $SALUDO $ bash $ echo $SALUDO $ exit $ export SALUDO=hola $ bash $ echo $SALUDO $ exit ¿Qué sucede en cada caso? ¿Cuándo no funciona el comando echo y porqué? Mediante el comando echo se imprime en pantalla la entrada asignada a cierta variable, de esta manera cuando ingresamos el primer comando en la terminal echo $SALUDO, no se imprime nada debido a que SALUDO no tiene ningún valor asignado, luego asignando a la variable de entorno SALUDO=hola, mediante el comando echo se imprime en pantalla la salida hola definida para la variable SALUDO, esto se puede observar en imagen 1. Luego al ingresar bash en línea de comando nos trasladamos a un nuevo shell, del tal manera que si tratamos de ver que salida nos imprime el comando echo $SALUDO, este será en blanco de nuevo debido a que debemos definir de nuevo la variable SALUDO mediante el comando export VARIABLE=variable. Imagen 1. Comando echo y variables de entorno. 3. Declare algunas variables usando el comando export. Verifique que la declaración haya sido exitosa usando printenv. ¿Qué sucede con las variables declaradas si cierra la sesión y la inicia de nuevo? A partir del comando export declaramos algunas variables, en mi caso en específico declara las variables A,B y C con sus respectivos valores A=a B=b y C=c, como se puede observar en imagen 2. A partir del comando printenv se puede observar que la declaración ha sido exitosa, de nuevo hago referencia a imagen 2 para respaldar lo dicho anteriormente. Si cerramos e iniciamos sesión las variables no se guardan las variables declaradas o definidas anteriormente por lo tanto no pueden ser utilizadas, esto quiere decir que si abrimos una nueva terminal, la salida de las variables A, B y C serán nulas o en blanco. Imagen 2. Comando export y variables. 4. Declare algunas variables usando export, pero esta vez editando el archivo ~/.bashrc (archivo de configuración de bash para el usuario). Cierre la sesión e ingrese de nuevo. ¿Qué sucede ahora con las variables? Si realizamos un proceso similar al anterior, pero modificando el archivo .bashrc el cual almacena las variables declaradas y los datos pertenecientes al shell bash, podemos cerrar sesión e iniciar de nuevo sin temor a perder la información de las variables definidas. De esta manera mediante el comando nano o gedit modicamos el archivo de configuración antes mencionado y agregamos las variables de entorno deseadas, en este caso SALUDO1=buenosdias SALUDO2=buenastardes SALUDO3=buenasnoches; imagen 3. De esta manera mediante el comando export definimos las variables en línea de comandos y podemos seguir utilzando las variables aún cuando cerremos sesión. Se puede observar los anterior en imagen 4. Imagen 3. Edición de archivo .bashrc Imagen 4. Archivo bashrc 5. Explore las redirecciones de entrada y salida y las tuberías usando los siguientes comandos (si tiene dudas sobre lo que hace alguno de los comandos, consulte la página de manual): $ date > fecha.txt CASO 1 $ date >> fecha.txt CASO 2 $ ls -l /etc/ > dir.txt CASO 3 $ ls -l /bin/ > dir.txt CASO 4 $ echo Hola Mundo! > hola.txt CASO 5 $ gzip < /etc/passswd > passwd.gz CASO 6 $ gzip –dc passwd.gz | less CASO 7 $ apt-cache search text editor | less CASO 8 $ cat /etc/passwd | grep root CASO 9 $ cat /usr/share/doc/gcc/copyright | wc CASO 10 $ ls –l /etc/ | tee ls.txt CASO 11 ¿Qué sucede en cada caso? ¿Qué función cumple la redirección o tubería? Dividiendo las redirecciones de entrada y salida en casos, analizo y explico uno a uno haciendo referencia a las imágenes siguientes. Para el primer caso $ date > fecha.txt, sabemos de antemano que mediante el comando date se obtiene en salida la fecha del sistema, de tal manera que mediante el símbolo “>” redireccionamos la información brindada por el comando date al archivo fecha.txt. Dado que el archivo no existe se crea con el nombre asignado y dado que no existe información se ingresa la respuesta del comando date. Para el segundo caso es muy similar sin embargo en este caso mediante “>>” logramos direccionar la salida del comando date al archivo fecha.txt. En este caso dado que el archivo ya existía, el nuevo contenido es agregado al final Imagen 5. Comando date y archivo fecha.txt En la caso 3 y 4, guardamos la salida del comando ls –l /etc/ y ls –l / bin/, en los archivos dir.txt. Se puede observar en imagen 6, que dado que el archivo no estaba creado se crea en el directorio donde nos encontremos y se guarda el output de los comandos respectivos en el archivo dir.txt. Dado que utizamos el redireccionamiento mediante “>” entonces guardamos inicialmente los valores desplegadas por el comando ls –l /etc/ y luego le caemos encima mediante el comando ls –l / bin/, a partir del comando cat dir.txt podemos ver lo grabado dentro del archivo mencionado. Imagen 6. Archivo dir.txt Como vimos anteriormente el comando echo despliega como respuesta la cadena de valores asignadas a este comando, entonces para el caso 5 mediante el comando echo Hola Mundo!, redireccionado hacia el archivo hola.txt este archivo se crea y dentro de él se guarda la salida desplega por el comando echo. Para observar lo que ocurre en imagen 8 donde se puede utilizar el comando cat hola.txt;de esta manera se observa lo que despliega el archivo hola.txt. Siguiendo con el caso 6 y haciendo referencia a la imagen 9, podemos observar que mediante el gzip < /etc/passswd > passwd.gz, se logra redireccionar la entrada del archivo a un archivo comprimido y a su vez nombrarlo passwd.gz. A su vez mediante el comando gzip –dc passwd.gz | less, este archivo se descomprime y con el uso de la tubería o pipe se toma la salida del comando a la izquierda como la salida del comando a la derecha dado que less es utilizado para desplegar en pantalla lo existente dentro de cierto archivo. Imagen 7. Archivo hola.txt Imagen 8. Archivo passwd.gz Imagen 9. Comando gzip -dc Para el caso 8 hago referencia a imagen 10, para observar lo logrado mediante la tubería, dado que el comando apt –cache search text editor se encarga de buscar los paquetes con este nombre, busca y encuentra el paquete text editor y luego mediante el símbolo “|” se hace el pipe y se logra redireccionar la salida del comando inicial con el comando less de la izquierda. De tal manera que lo desplegado en pantalla es la información acerca del paquete text editor. Siguiendo con las tuberías y el caso 9, podemos observar que el comando cat /etc/passwd se encarga de desplegar la información existente dentro del archivo /etc/passwd y mediante la tubería o pipe se utiliza esta salida como entrada del comando grep, de tal manera que la tubería cat /etc/passwd | grep root, se encarga de buscar la cadena de líneas que coincidan con la palabra root dentro del archivo asignado. Podemos observar esto en la imagen 11. Por último para las redirecciones y tuberías de los casos 10 y 11, se observa que el uso del comando wc para el caso 10 donde se toma la salida del comando cat /usr/share/doc/gcc/copyright y se direcciona a el comando wc el cual se encarga de contar los caracteres del archivo indicado y se despliega en pantalla en el siguiente orden líneas/palabras/caracteres. Para finalizar esta sección en el caso 11 se utilizado el comando tee, el cual es un comando que escribe en salida estándar y en un archivo todo lo que es introducido en su entrada estándar. En este caso en específico, se observa en imagen 12 como se crear el archivo ls.txt y además se despliega en pantalla la información de entrada del comando respectivo. Imagen 10. Tuberías y comando less Imagen 11. Tuberías y comando grep Imagen 12. Tuberías y comando tee. Segunda Parte: Programación de tareas con cron 1. Edite el crontab del usuario y agregue el comando date >> /tmp/date para que sea ejecutado cada minuto. Espere un par de minutos y compruebe que la acción se haya efectuado correctamente. Mediante el comando crontab –e se puede modificar el crontab del usuario, no tenemos problemas con los permisos dado que tenemos que modificar el cron relacionado con el usuario. Agregamos el comando * * * * * date >> /tmp/date al final del archivo del crontab, los asteriscos significan respectivamente minutos, horas, día, mes y día de la semana. Dado que lo que nos interesa en nuestro ejercicio es ejecutar el comando cada minuto dejamos sin valor estos datos. Sabemos ya que el date imprime en pantalla la fecha y hora del servidor, luego redireccionamos este valor al archivo /tmp/date. Esto se puede observar en imagen 13, luego después de haber modificado el crontab esperamos en la terminal unos minutos y mediante el comando cat /tmp/date, podemos observar el funcionamiento correcto de esta acción, hago referencia a imagen 14. Imagen 13. Edición del crontab del usuario. Imagen 14. Comando date >> /tmp/date 2. Edite el crontab del sistema y agregue el comando que se muestra a continuación para que sea ejecutado dentro de tres minutos (compruebe la hora del sistema usando el comando date) y todos los demás días jueves de cada semana a la misma hora. El comando debe ser ejecutado por el usuario root: echo “Esto es una prueba” > /root/prueba Espere y compruebe su funcionamiento. En este caso debido a que debemos modificar el crontab del sistema, debemos modificar el archivo de configuración /etc/crontab mediante comandos como el gedit o nano sin embargo dado que vamos a modificar un archivo de root necesitamos permiso del superusuario esto mediante el comando sudo delante del comando. Se puede observar que mediante el comando gedit modifico el archivo de configuración y agrego al final el comando 43 23 25 03 * dado que la feha del servidor en el momento de realizar el ejercicio era 23:42:38 del 25 de marzo. Luego cerramos el archivo y esperamos un minuto para observar la acción del proceso mediante el comando sudo cat /root/prueba de tal manera que en pantalla se despliega “Esto es una prueba”. Por último se agrega en el archivo de configuración el comando 43 23 * * 4 para lograr lo solicitado de obtener la misma respuesta todos los jueves a la misma hora. Esto se puede observar en la imagen 15 y 16 respectivamente. Imagen 15. Edición del crontab del servidor Imagen 16. Edición del crontab del usuario.