ERROR USUARIO NO VALIDADO 1
El módulo de introducción al Sistema Operativo Linux se estructura en los siguientes apartados:
GNU/Linux es un sistema operativo, compatible con UNIX, y que se distribuye bajo licencia GNU General Public License, lo cual quiere decir que es un sistema operativo libre (su uso no requiere el pago de ninguna licencia) y que además el código fuente del mismo está disponible. Se trata de un SO relativamente joven, puesto que su primera versión data del año 1991. Desde esa fecha hasta la actualidad han surgido numerosas distribuciones de este SO, incluso en versión LiveCD, que nos permiten utilizar Linux sin necesidad de instalarlo en nuestra máquina.
Aunque se trate de un sistema de libre distribución y en el que participan multitud de desarrolladores en todo el mundo, no quiere decir que no exista una documentación completa y adecuada a cada nivel de usuario. En los siguientes enlaces se puede encontrar numerosos documentos y manuales para el manejo de este SO:
Para iniciar una sesión de trabajo hay que introducir el nombre de la cuenta de usuario y la clave. El sistema pregunta por la cuenta de usuario mediante un título similar a Login: y por la clave mediante un título similar a Password:. Rellenando dichos datos se entra a trabajar en el sistema. El sistema presentará una interfaz gráfica o alfanumérica, según esté configurado.
El objetivo de este módulo es que el alumno se familiarice con la interfaz de usuario de un sistema UNIX, facilitada por un Shell alfanumérico. El Shell es, básicamente un intérprete de mandatos mucho más flexible y potente que cualquier interfaz gráfica.
Se realizarán ejercicios con los mandatos más importantes y se introducirán las combinaciones de teclas fundamentales.
Los mandatos internos, del Shell-bash, utilizados en este módulo son los siguientes:
Los mandatos externos (ejecutables) utilizados en este módulo son los siguientes:
Programas que se van a utilizar:
Ficheros que se van a utilizar:
Los ejercicios de estas prácticas deben ser realizados en una máquina con sistema operativo Linux.
Se pueden plantear, en general, dos situaciones: que la máquina en la que trabaja disponga de Linux instalado o bien que tenga otro sistema operativo (Windows, OS X). En el primer caso, bastará con abrir una o varias ventanas de mandatos (Shell) para realizar los ejercicios. El Centro de Cálculo dispone de salas (Águila, Monje, Nerja, Cogull o Artá) en las que las máquinas disponen de Linux. En otro caso, será necesario establecer una conexión, de acuerdo al protocolo seguro ssh, a una máquina remota Linux en la que se disponga de cuenta de usuario, por ejemplo, triqui (solo accesible desde la red local de la Facultad).
Para la conexión mediante protocolo ssh a una máquina remota Linux, desde una máquina Windows, se puede utilizar la aplicación PuTTy (cliente Telnet y SSH).
Otra utilidad interesante es WinScp, que permite copiar ficheros entre una máquina local Windows y cualquier otra máquina que tenga un servidor scp. Los sistemas Linux suelen tener un servidor de este tipo instalado. En el caso de las máquinas que utilizan Windows, se pueden instalar servidores tanto ssh como scp, por ejemplo, WinSSHD.
Para la ejecución de numerosos ejercicios es necesario disponer de los programas facilitados al efecto, programas que deben estar ubicados en la cuenta Linux que se utilizará para la ejecución de los ejercicios. Se recomienda crear un directorio específico en el que se almacenarán estos programas, por ejemplo, PracticasAnalisis.
Si decide instalar Linux en su PC, observe la siguiente recomendación:
REALICE TODOS LOS EJERCICIOS DESDE UNA CUENTA DE USUARIO, NO DESDE LA CUENTA DE SUPERUSUARIO.
Para unificar la nomenclatura de las teclas usaremos los nombres indicados en la figura adjunta. Destacamos la tecla de retorno de carro (return), que llamaremos Ret, y la tecla de control, que llamaremos Ctrl.
En algunos casos es necesario pulsar una combinación de teclas, en las explicaciones esto se indicará de la siguiente forma: [tecla1+tecla2+…]. Por ejemplo, para matar un proceso (programa en ejecución) de un terminal se usa la combinación de las teclas «Control» y «c», lo que representaremos como [Ctrl+c].
Dependiendo del tipo de ventana, las funciones de copiar y pegar son distintas, existiendo básicamente dos alternativas:
Aunque existen entornos de trabajo gráficos como son el KDE y el Gnome, con frecuencia es necesario trabajar con Shell textual. Un Ingeniero Informático debe estar familiarizado con el entorno alfanumérico, puesto que, aunque tiene una curva de aprendizaje más lenta, permite hacer muchas más cosas que el entorno gráfico.
En todo el curso consideraremos el trabajo a través de Shell alfanumérico, por la razón antes expuesta de que el Ingeniero Informático ha de ser capaz de desenvolverse a este nivel, imprescindible para realizar muchas labores de administración y manejo del sistema. En los ejemplos utilizaremos el bash, pues es uno de los más utilizados.
La interacción a través de Shell alfanumérico se hace mediante mandatos. El Shell escribe un texto, llamado “prompt” o texto de apremio, para indicar al usuario que puede introducir un mandato. El prompt es configurable. En las cuentas de usuario es muy frecuente que incluya el nombre del directorio en el que se está trabajando.
En triqui, el mandato chsh con la opción -l, nos permite conocer todos los Shell disponibles. Otra opción, para conocer los Shells disponibles en una determinada máquina es acceder al contenido del fichero /etc/shells.
NOTA.- Para cambiar a un Shell determinado, basta con teclear el nombre del nuevo Shell y pulsar la tecla Ret. Para salir del Shell basta con teclear exit.
Un mandato se compone de los siguientes elementos:
mandato [opciones] [argumentos]
En la definición de un mandato se utilizan las siguientes convenciones:
El ejemplo siguiente muestra la invocación del mandato ls, con la opción -l, utilizando un formato de prompt muy corriente que incluye los siguientes elementos: nombre de la cuenta (alumno), nombre de la máquina (maquinaLinux) y el subdirectorio (SubDirectorio) a partir del home de la cuenta (~):
Una opción que suelen incluir todos los mandatos, por defecto, es la opción de ayuda o help, que se puede invocar del siguiente modo:
alumno@maquinaLinux:~$ mandato -h
o en su versión larga
alumno@maquinaLinux:~$ mandato --help
A continuación presentamos algunos mandatos de interés:
El mandato man va a ser imprescindible para realizar las prácticas de la asignatura pues es la principal fuente de información (junto con las transparencias de teoría) sobre mandatos y servicios. Por ello conviene familiarizarse con él cuanto antes. La información presentada suele ser muy extensa, puesto que la mayoría de los mandatos tienen múltiples opciones. Puede utilizar las teclas de desplazamiento (arriba y abajo) para desplazarse por los documentos y la barra espaciadora para avanzar página a página. Para salir, pulsar q.
IMPORTANTE: Si lo que se busca debe incluir una cadena de caracteres distintiva, es mucho más efectivo buscar directamente la misma. Para buscar palabras en los documentos: ”/abc” busca el texto abc. Tecla “n” avanza a siguiente ocurrencia. Tecla “N” retrocede. (Estas teclas también funcionan en otros mandatos que presentan pantallas, por ejemplo “less”).
IMPORTANTE: Cuando man nos presente el documento, debemos observar en la parte superior el número entre paréntesis que aparece tras el nombre del mandato o servicio. ”(1)” indica que es un mandato y ”(2)” un servicio. Realmente este número indica la sección de los manuales de referencia de Linux: 1. Mandatos (Ej: ls, cd, ps, man, cat…) 2. Llamadas al sistema (servicios) (Ej: open, umask…) 3. Funciones de biblioteca (Ej: printf, fopen) 4. Dispositivos (Ej: null) 5. Formato de ficheros (Ej. passwd) 6. Juegos 7. Miscelánea 8. Mandatos de Administración del Sistema A veces man no muestra el ítem que deseamos porque el mismo nombre aparece en varias secciones. Por ejemplo, si queremos ayuda del servicio open, man open no nos muestra el servicio sino un mandato (código 1). En estos casos se puede solicitar que busque sólo en una de las secciones: man 2 open muestra el servicio open.
Utilice info para obtener información del mandato date y compare con la información suministrada por man.
En algunos Shell, como en el caso de bash, utilizando la tecla de tabulación podemos completar nombres de mandatos y archivos de manera automática.
Cuando existen varias alternativas al pulsar el tabulador, en vez de completar emite un sonido. Pulsando otra vez el tabulador aparecerá una lista con las distintas alternativas existentes. Escriba «d» y pulse el tabulador. Vuelva a pulsar el tabulador. Verá que se muestran todas las posibles alternativas a ejecutar que comienzan con la letra d
Las combinaciones [Ctrl+s] y [Ctrl+q] sirven para parar y volver a arrancar la salida. Escriba todo seguido: ls -l [Ctrl+s] Ret. Observará que no se produce ninguna salida. Pulse, ahora, [Ctrl+q], verá como aparece el resultado del mandato ls.
Mediante la utilización de las teclas ↑ y ↓, se puede navegar a través del histórico de mandatos que se han utilizado previamente. Pruebe esta combinación de teclas y verá como aparecen los mandatos que ha utilizado.
Cierre la sesión con logout o exit.
El árbol de directorios permite identificar ficheros y dispositivos.
Los sistemas Unix se organizan en un único árbol de directorios. El origen de este árbol de directorios se denomina directorio raíz, y de él cuelgan el resto de directorios que contenga el sistema. Además del directorio raíz, existen otros dos directorios “especiales”. El directorio home, es el directorio asociado a una cuenta de usuario. Es el directorio en el que un usuario se sitúa, por defecto, al entrar en una máquina Linux y en el que el usuario puede almacenar sus ficheros. El directorio de trabajo es el directorio en el que se sitúa el Shell en cada momento.
Los mandatos más importantes en relación con el árbol de directorios son: ls, cd, pwd, mkdir, rm y rmdir
El mandato ls permite listar los ficheros de un directorio. Si no se especifica el nombre del directorio, ls lista el directorio de trabajo. Con la opción –l (no confundir con el «1») suministra varios datos adicionales de cada fichero, con el siguiente significado:
En principio, su cuenta de usuario estará vacía, por lo que si ejecuta el mandato ls no se listará ningún fichero.
Para crear un directorio (por ejemplo ProgrPrac) se ejecuta el mandato mkdir como sigue:
alumno@maquinaLinux:~$ mkdir ProgrPrac
El directorio es creado dentro del directorio de trabajo. Por tanto, hay que estar en el lugar deseado o hay que dar el nombre completo del directorio a crear.
Intente crear un directorio en el raíz, verá que, si no es súper usuario, no podrá hacerlo.
Para eliminar un directorio (por ejemplo ProgrPrac, recién creado) se ejecuta el mandato rmdir como sigue:
alumno@maquinaLinux:~$ rmdir ProgrPrac
Para eliminar un directorio mediante este mandato, es necesario que dicho directorio esté vacío (no contenga ni ficheros ni subdirectorios). En el caso de que el directorio a eliminar no esté vacío, obtendríamos el siguiente error:
alumno@maquinaLinux:~$ rmdir ProgrPrac rmdir: 'ProgrPrac/': Directory not empty
Para borrar un directorio primero hay que vaciarlo. Para ello utilizamos el mandato rm. Observe que el carácter «*» indica todos los ficheros. Es muy peligroso usar un mandato rm con un «*», puesto que puede borrar más de lo que queremos, hay que estar muy seguro de lo que se está haciendo. Además, no podemos deshacer el borrado.
alumno@maquinaLinux:~$ rm ProgrPrac/* alumno@maquinaLinux:~$ rmdir ProgrPrac
Otra opción, si queremos eliminar un directorio independientemente de que esté vacío o no, es utilizar el mandato rm (man rm).
Para cambiar el directorio de trabajo se utiliza el mandato cd. Por ejemplo, para posicionarnos en el directorio recién creado ponemos:
alumno@maquinaLinux:~$ cd ProgrPrac/ alumno@maquinaLinux:~/ProgrPrac$
Observamos que ahora el prompt ha cambiado, para indicarnos el cambio de directorio (que el prompt cambie depende de su configuración).
Con cd .. (No olvidar el espacio) se retrocede un nivel en el árbol de directorios.
alumno@maquinaLinux:~/ProgrPrac$ cd .. alumno@maquinaLinux:~$
El mandato pwd muestra la ruta absoluta al directorio actual (nos permite conocer el lugar en el que estamos dentro del árbol de directorios). Es especialmente útil cuando el prompt no muestra el directorio.
alumno@maquinaLinux:~$ pwd /home/alumnosSSOO/alumno/
Si ejecutamos pwd en el directorio home, como en el ejemplo anterior, obtenemos el nombre completo de nuestro directorio home.
En el ejemplo hemos obtenido el nombre completo del directorio de trabajo de la cuenta alumno.
Observe que el directorio home se representa por «~», tal y como aparece en el prompt. Para obtener el carácter «~» hay que pulsar la combinación de teclas [AltGr+4] y pulsar seguidamente el blanco (barra espaciadora).
Con el mandato cd / nos posicionamos en el directorio raíz. Después de ejecutar ese mandato debe volver a su directorio home para seguir con los ejercicios. Puede volver poniendo el camino de su directorio home, en nuestro ejemplo, con el mandato cd /home/alumnosSSOO/alumno/, con el mandato cd ~, o bien simplemente con cd
Practique los mandatos ls y cd para moverse y conocer el árbol de directorios de su máquina de prácticas.
Obtenga el contenido del directorio raíz.
alumno@maquinaLinux:/$ ls -l total 160 drwxr-xr-x 2 root root 4096 May 14 12:49 bin drwxr-xr-x 4 root root 3072 Jul 2 10:26 boot drwxr-xr-x 12 root root 4080 Jul 3 09:46 dev drwxr-xr-x 120 root root 12288 Jul 9 13:38 etc drwxr-xr-x 5 root root 4096 Mar 11 18:56 home drwxr-xr-x 12 root root 4096 May 14 04:03 lib drwxr-xr-x 7 root root 4096 Jun 9 04:02 lib64 drwx------ 2 root root 16384 Jan 19 12:35 lost+found drwxr-xr-x 2 root root 4096 Mar 11 18:56 media drwxr-xr-x 2 root root 0 Jul 3 09:46 misc drwxr-xr-x 2 root root 4096 Mar 11 18:56 mnt drwxr-xr-x 2 root root 0 Jul 3 09:46 net drwxr-xr-x 5 root root 4096 Apr 15 17:08 opt dr-xr-xr-x 186 root root 0 Jul 3 11:45 proc drwxr-x--- 23 root root 4096 Jul 9 13:02 root drwxr-xr-x 2 root root 12288 Jun 23 04:02 sbin drwxr-xr-x 2 root root 4096 Mar 11 18:56 selinux drwxr-xr-x 2 root root 4096 Mar 11 18:56 srv drwxr-xr-x 11 root root 0 Jul 3 11:45 sys drwxrwxrwt 15 root root 4096 Jul 9 16:39 tmp drwxr-xr-x 16 root root 4096 Apr 2 11:46 usr drwxr-xr-x 26 root root 4096 Jun 8 09:49 var
La estructura que encontrará será parecida a la mostrada. El dueño del directorio raíz y de sus subdirectorios será el súper usuario o root. El uso de algunos de dichos subdirectorios es el siguiente:
En ejercicios posteriores verá el uso que se hace del directorio /proc para obtener información del proceso y sistema.
Con la opción –a del mandato ls obtenemos los ficheros ocultos, así como los directorios de nombre «.» y «..». El nombre «.» se refiere al directorio que lo contiene /home/alumnosSSOO/alumno en el ejemplo) y el nombre «..» se refiere al directorio padre de este (/home/alumnosSSOO en el ejemplo). Por esta razón el mandato cd .. retrocede al directorio padre.
alumno@maquinaLinux:~$ pwd /home/alumnosSSOO/alumno/ alumno@maquinaLinux:~$ ls -l total 4 drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 23 11:09 ProgrPrac alumno@maquinaLinux:~$ ls -la total 52 drwxr-xr-x 4 alumno GrupoAlumno 4096 Jul 23 12:16 . drwxr-xr-x 3 root root 4096 Jul 21 19:21 .. -rw-r--r-- 1 alumno GrupoAlumno 266 Jul 21 19:21 .alias -rw------- 1 alumno GrupoAlumno 772 Jul 23 11:51 .bash_history -rw-r--r-- 1 alumno GrupoAlumno 174 Jul 21 19:21 .bash_logout -rw-r--r-- 1 alumno GrupoAlumno 414 Jul 21 19:21 .bash_profile -rw-r--r-- 1 alumno GrupoAlumno 2044 Jul 21 19:21 .bashrc -rw-r--r-- 1 alumno GrupoAlumno 375 Jul 21 19:21 .cshrc drwxr-xr-x 3 alumno GrupoAlumno 4096 Jul 23 10:52 .emacs.d -rw-r--r-- 1 alumno GrupoAlumno 85 Jul 23 12:09 .projects.ede -rw------- 1 alumno GrupoAlumno 970 Jul 23 11:29 .viminfo -rw-r--r-- 1 alumno GrupoAlumno 59 Jul 21 19:21 .zshrc drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 23 11:09 ProgrPrac
El Shell, además de ser el encargado de interpretar los mandatos, es capaz de interpretar ciertos caracteres especiales llamados caracteres de extensión. Cuando se utiliza alguno de ellos, los mandatos no lo reciben, sino que el Shell reemplaza ese carácter especial por lo que corresponda. De este modo el mandato recibe esta sustitución en lugar del carácter de extensión.
Al especificar los nombres de los ficheros y directorios se pueden utilizar los siguientes caracteres de extensión.
alumno@maquinaLinux:~$ ls -la .b* -rw------- 1 alumno GrupoAlumno 2737 Jul 23 14:09 .bash_history -rw-r--r-- 1 alumno GrupoAlumno 174 Jul 21 19:21 .bash_logout -rw-r--r-- 1 alumno GrupoAlumno 414 Jul 21 19:21 .bash_profile -rw-r--r-- 1 alumno GrupoAlumno 2044 Jul 21 19:21 .bashrc
Vemos en el ejemplo que ahora solamente obtenemos los ficheros que empiezan por «.b».
El mandato cp permite copiar uno o múltiples ficheros a un directorio destino. La sintaxis básica del mandato es la siguiente:
alumno@maquinaLinux:~$ cp fichero_origen directorio_destino
De este modo, si no se produce ningún error en el proceso de copia y listamos el directorio destino, veremos el siguiente resultado:
alumno@maquinaLinux:~$ ls directorio_destino fichero_origen
El mandato mv permite cambiar el nombre de un fichero o bien mover el fichero especificado a una nueva ubicación. Si proporcionamos dos nombres de fichero, entonces el mandato mv, cambia el nombre del primer fichero por el segundo nombre:
alumno@maquinaLinux:~$ ls -l total 0 -rw-r--r-- 1 alumno GrupoAlumno 0 jul 9 22:22 fichero_1 alumno@maquinaLinux:~$ mv fichero_1 fichero_nuevo alumno@maquinaLinux:~$ ls -l total 0 -rw-r--r-- 1 alumno GrupoAlumno 0 jul 9 22:22 fichero_nuevo
Si proporcionamos, al mandato mv, el nombre de un fichero y un directorio destino, entonces moveremos el fichero origen al directorio especificado:
alumno@maquinaLinux:~$ mkdir directorio_destino alumno@maquinaLinux:~$ ls -l total 4 drwxr-xr-x 2 alumno GrupoAlumno 4096 jul 9 22:23 directorio_destino -rw-r--r-- 1 alumno GrupoAlumno 0 jul 9 22:22 fichero_nuevo alumno@maquinaLinux:~$ mv fichero_nuevo directorio_destino/ alumno@maquinaLinux:~$ ls -l total 4 drwxr-xr-x 2 alumno GrupoAlumno 4096 jul 9 22:23 directorio_destino alumno@maquinaLinux:~$ ls -l directorio_destino/ total 0 -rw-r--r-- 1 alumno GrupoAlumno 0 jul 9 22:22 fichero_nuevo alumno@maquinaLinux:~$
Para eliminar ficheros disponemos del mandato rm. Es muy importante tener en cuenta que los ficheros eliminados no serán “recuperables”. Adicionalmente, Linux dispone de un mandato que permite hacer imposible la recuperación de un fichero. Dicho mandato es shred. El mandato shred sobrescribe un fichero, para eliminar su contenido y mediante la opción -u permite eliminarlo definitivamente. De este modo nos aseguramos que la información contenida en el fichero así eliminado no pueda ser recuperada.
Ejecute los mandatos siguientes:
Cree el directorio FicherosPrac y entre en él.
alumno@maquinaLinux:~$ mkdir FicherosPrac alumno@maquinaLinux:~$ cd FicherosPrac/
Ejecute el editor de textos pico o nano creando un fichero llamado Prueba.
alumno@maquinaLinux:~/FicherosPrac$ pico Prueba
Dentro de la ventana pico/nano teclee un texto, por ejemplo:Esto es una prueba. Salga del editor pico mediante:
[Ctrl+x] Y (para salvar el texto) Ret (tecla de retorno de carro)
Vea que ahora tiene el fichero Prueba, creado con el editor.
alumno@maquinaLinux:~/FicherosPrac$ ls -l total 4 -rw-r--r-- 1 alumno GrupoAlumno 18 Jul 23 11:59 Prueba
Muestre, con el mandato cat, el contenido del fichero Prueba.
alumno@maquinaLinux:~/FicherosPrac$ cat Prueba Esto es una prueba
Copie, con el mandato cp, el fichero Prueba al fichero Otro.
alumno@maquinaLinux:~/FicherosPrac$ cp Prueba Otro alumno@maquinaLinux:~/FicherosPrac$ ls -l total 8 -rw-r--r-- 1 alumno GrupoAlumno 18 Jul 23 11:59 Otro -rw-r--r-- 1 alumno GrupoAlumno 18 Jul 23 11:59 Prueba
Cambie el nombre del fichero Prueba a Prueba2.
alumno@maquinaLinux:~/FicherosPrac$ mv Prueba Prueba2 alumno@maquinaLinux:~/FicherosPrac$ ls -l total 8 -rw-r--r-- 1 alumno GrupoAlumno 18 Jul 23 11:59 Otro -rw-r--r-- 1 alumno GrupoAlumno 18 Jul 23 11:59 Prueba2
Mueva el fichero Prueba2 al directorio padre. Liste el contenido del directorio y del directorio padre.
alumno@maquinaLinux:~/FicherosPrac$ mv Prueba2 .. alumno@maquinaLinux:~/FicherosPrac$ ls -l total 4 -rw-r--r-- 1 alumno GrupoAlumno 18 Jul 23 11:59 Otro alumno@maquinaLinux:~/FicherosPrac$ ls -l .. total 8 drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 25 08:12 FicherosPrac -rw-r--r-- 1 alumno GrupoAlumno 18 Jul 23 11:59 Prueba2
Borre, con el mandato rm, el fichero Prueba2, que se encuentra en el directorio padre.
alumno@maquinaLinux:~/FicherosPrac$ rm ../Prueba2 alumno@maquinaLinux:~/FicherosPrac$ ls -l .. total 4 drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 25 08:12 FicherosPrac
Abra el fichero Otro con el editor vi.
alumno@maquinaLinux:~/FicherosPrac$ vi Otro
Salga del editor vi sin modificar el fichero mediante las tres teclas «:», «q» y «Ret». Abra el fichero Otro con el editor emacs.
alumno@maquinaLinux:~/FicherosPrac$ emacs -nw Otro
Modifique el fichero Otro añadiendo texto a continuación de Esto es una prueba. Salga del editor emacs mediante: [Ctrl+x] y [Ctrl+c] y guarde las modificaciones realizadas. Observe, con el mandato cat, el contenido del fichero Otro y ejecute el mandato wc sobre el fichero Otro
alumno@maquinaLinux:~/FicherosPrac$ cat Otro Esto es una prueba. Al que hemos añadido texto. alumno@maquinaLinux:~/FicherosPrac$ wc Otro 2 9 49 Otro
Ejecute el mandato ls. Observará que ha aparecido el fichero Otro~. Muchas aplicaciones que modifican ficheros, como son los editores de texto, pueden crear automáticamente copias de salvaguarda o backup. Para diferenciar esas copias de los originales le suelen añadir al final del nombre el carácter «~».
alumno@maquinaLinux:~/FicherosPrac$ ls -la total 8 -rw-r--r-- 1 alumno GrupoAlumno 49 Jul 24 12:32 Otro -rw-r--r-- 1 alumno GrupoAlumno 20 Jul 24 12:31 Otro~
Compare el número de caracteres del fichero suministrado por el mandato wc con el tamaño del fichero suministrado por el mandato ls.
Para agrupar o comprimir un conjunto de ficheros se pueden utilizar los mandatos tar y gzip.
El mandato tar genera un fichero a partir de un conjunto de ellos, es decir permite agrupar (empaquetar) un conjunto de ficheros en un único fichero. Adicionalmente, este fichero se puede comprimir. Para probar el funcionamiento de este mandato, en primer lugar crearemos un nuevo fichero en el directorio FicherosPrac (p. ej. copiando el fichero Otro a Nuevo). De este modo dicho directorio contendrá 3 ficheros.
alumno@maquinaLinux:~$ cp FicherosPrac/Otro FicherosPrac/Nuevo alumno@maquinaLinux:~$ ls FicherosPrac Nuevo Otro Otro~
Utilice el mandato man para conocer las opciones del mandato tar necesarias para crear un fichero de nombre colecc_1.tar del contenido del directorio FicherosPrac y cree dicho fichero.
El mandato tar - t muestra los nombres de los ficheros contenidos en un fichero .tar.
alumno@maquinaLinux:~$ tar -tv -f colecc_1.tar drwxr-xr-x alumno/GrupoAlumno 0 2009-07-24 13:42:06 FicherosPrac/ -rw-r--r-- alumno/GrupoAlumno 49 2009-07-24 13:42:06 FicherosPrac/Nuevo -rw-r--r-- alumno/GrupoAlumno 49 2009-07-24 12:32:20 FicherosPrac/Otro -rw-r--r-- alumno/GrupoAlumno 20 2009-07-24 12:31:26 FicherosPrac/Otro~
El mandato tar también nos permite extraer (desempaquetar) los ficheros contenidos en un fichero .tar. Para ello basta con ejecutar dicho mandato con la opción -x. Cambie de directorio de trabajo a FicherosPrac, y a continuación extraiga el contenido del fichero colecc_1.tar anteriormente creado. En el ejemplo, observe que, al poner ../colecc_1.tar nos estamos refiriendo al fichero colecc_1.tar que está en el directorio padre del de trabajo.
alumno@maquinaLinux:~$ cd FicherosPrac alumno@maquinaLinux:~/FicherosPrac$ tar -xv -f ../colecc_1.tar FicherosPrac/ FicherosPrac/Nuevo FicherosPrac/Otro FicherosPrac/Otro~
Con ls observe que dentro del directorio FicherosPrac aparece otro FicherosPrac, que ha sido creado al extraer el tar.
alumno@maquinaLinux:~/FicherosPrac$ ls -l total 16 drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 24 13:42 FicherosPrac -rw-r--r-- 1 alumno GrupoAlumno 49 Jul 24 13:42 Nuevo -rw-r--r-- 1 alumno GrupoAlumno 49 Jul 24 12:32 Otro -rw-r--r-- 1 alumno GrupoAlumno 20 Jul 24 12:31 Otro~
Posiciónese en este nuevo directorio y observe que tiene los ficheros que se habían incluido en el tar.
alumno@maquinaLinux:~/FicherosPrac$ cd FicherosPrac/ alumno@maquinaLinux:~/FicherosPrac/FicherosPrac$ ls -l total 12 -rw-r--r-- 1 alumno GrupoAlumno 49 Jul 24 13:42 Nuevo -rw-r--r-- 1 alumno GrupoAlumno 49 Jul 24 12:32 Otro -rw-r--r-- 1 alumno GrupoAlumno 20 Jul 24 12:31 Otro~
Sitúese en el directorio ~/FicherosPrac, y borre el directorio creado en esta última secuencia.
El mandato tar -czf empaqueta con formato .tar y comprime con formato gzip. Estos ficheros (muy usados) deben usar la extensión .tar.gz, o bien .tgz.
El contenido de un .tar.gz se puede mostrar con el mismo mandato usado para un .tar. Listamos los ficheros del tar, para observar los que se han incluido.
El mandato tar dispone también de una opción que permite extraer un fichero tar comprimido.
Con el mandato gzip podemos comprimir y descomprimir ficheros. Los ficheros comprimidos obligatoriamente han de incluir la extensión .gz. Dado que gzip utiliza el mismo algoritmo de compresión que el tar, se puede descomprimir un tar comprimido. Veamos un ejemplo: descomprima el tar comprimido generado anteriormente como se muestra a continuación.
alumno@maquinaLinux:~$ ls -l total 12 drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 24 16:46 FicherosPrac drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 23 13:12 ProgrPrac -rw-r--r-- 1 alumno GrupoAlumno 10240 Jul 24 19:46 colecc_1.tar -rw-r--r-- 1 alumno GrupoAlumno 274 Jul 24 19:46 colecc_2.tar.gz alumno@maquinaLinux:~$ gzip -d colecc_2.tar.gz alumno@maquinaLinux:~$ ls -l total 20 drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 24 16:46 FicherosPrac drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 23 13:12 ProgrPrac -rw-r--r-- 1 alumno GrupoAlumno 10240 Jul 24 19:46 colecc_1.tar -rw-r--r-- 1 alumno GrupoAlumno 10240 Jul 24 19:46 colecc_2.tar
Observe que el mandato gzip ha borrado el fichero con extensión .gz y ha producido el fichero descomprimido. Observe los tamaños de ambos ficheros: 274 B frente a 10240 B.
Borre los ficheros y directorios creados.
alumno@maquinaLinux:~$ ls -l total 20 drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 24 16:46 FicherosPrac drwxr-xr-x 2 alumno GrupoAlumno 4096 Jul 23 13:12 ProgrPrac -rw-r--r-- 1 alumno GrupoAlumno 10240 Jul 24 19:46 colecc_1.tar -rw-r--r-- 1 alumno GrupoAlumno 10240 Jul 24 19:46 colecc_2.tar alumno@maquinaLinux:~$ rm *.tar alumno@maquinaLinux:~$ rm FicherosPrac/* alumno@maquinaLinux:~$ rmdir FicherosPrac/ alumno@maquinaLinux:~$ rm ProgrPrac/* alumno@maquinaLinux:~$ rmdir ProgrPrac/
Para buscar ficheros se puede utilizar el mandato find.
El mandato find sirve para buscar, a partir de un punto del árbol de directorios, ficheros que cumplan determinados criterios. Se puede especificar:
En el ejemplo siguiente se busca en el directorio /lib/, y en todos sus subdirectorios, los ficheros de cualquier tipo cuyo nombre contiene la cadena sl.
alumno@maquinaLinux:~$ find /lib/ -name '*sl*' /lib/modules/2.2.19pre17/net/slhc.o /lib/modules/2.2.19pre17/net/slip.o /lib/modules/2.2.19pre17/misc/radio-aimslab.o /lib/libslang.so.2.0.4 /lib/libslang.so.1 /lib/tls/libnsl-2.3.2.so /lib/tls/libnsl.so.1 /lib/libslang.so.1.4.9 /lib/libslang.so.1-UTF8.4.9 /lib/libslang.so.1-UTF8 /lib/libnsl.so.1 /lib/libslang.so.2 /lib/libnsl-2.3.2.so
El mandato grep sirve para buscar en los ficheros especificados líneas que contengan un determinado texto (man grep).
En el fichero /etc/passwd se almacena información sobre los usuarios que pueden acceder a la máquina, así como cierta información para cada uno de estos usuarios, como es: nombre de la cuenta, clave encriptada o x, UID de la cuenta, GID del grupo al que pertenece la cuenta, nombre del usuario, directorio de trabajo, y el Shell.
Descargar de la web de la asignatura el material de apoyo de las prácticas de análisis (es un fichero .tgz) y ubicarlo en una cuenta Linux.
Mediante el mandato ls –l, compruebe que el fichero ha sido transferido.
alumno@maquinaLinux:~$ ls -l total 4 -rw-r--r-- 1 alumno GrupoAlumno 17628 Feb 14 19:19 ProgrPrac-x.x.tgz
Descomprima el fichero ProgrPrac-x.x.tgz y sitúese dentro del directorio creado, en el subdirectorio relativo a este módulo (ModuloIntroduccion).
El mandato cmp permite comparar dos ficheros, de cualquier tipo, byte a byte.
Copie el fichero CPUyES.c al fichero CPUyESmio.c.
alumno@maquinaLinux:~/PracticasAnalisis/ModuloIntroduccion$ cp CPUyES.c CPUyESmio.c
Modifique el fichero CPUyESmio.c, por ejemplo con el editor vi y salve el fichero modificado. Compare los ficheros CPUyES.c y CPUyESmio.c con el mandato cmp. Este mandato, sin opciones, indica la primera diferencia.
alumno@maquinaLinux:~/PracticasAnalisis/ModuloIntroduccion$ cmp CPUyES.c CPUyESmio.c CPUyES.c CPUyESmio.c differ: char 11, line 1
Con la opción -l el mandato cmp nos indica todas las diferencias, de acuerdo al formato siguiente: nº de byte en decimal, valor en formato octal del byte (código ASCII) en el primer fichero y valor en formato octal del byte (código ASCII) en el segundo fichero. Con la opción -b, se muestran los caracteres además de su valor en formato octal. Por lo tanto, obtendremos una línea por cada byte diferente.
alumno@maquinaLinux:~/PracticasAnalisis/ModuloIntroduccion$ cmp -l -b CPUyES.c CPUyESmio.c cmp: EOF on CPUyES.c cmp: EOF on CPUyES.c 10 56 . 155 m 11 143 c 151 i 12 40 157 o 13 52 * 56 . 14 57 / 143 c 15 12 ^J 40 ……. Más líneas que no reproducimos …….. 901 60 0 141 a 902 73 ; 40 903 12 ^J 145 e 904 175 } 163 s 905 12 ^J 143 c
El mandato diff compara dos ficheros de texto línea a línea. Compare los ficheros CPUyES.c y CPUyESmio.c con el mandato diff.
alumno@maquinaLinux:~/PracticasAnalisis/ModuloIntroduccion$ diff CPUyES.c CPUyESmio.c 1c1 < /* CPUyES.c */ --- > /* CPUyESmio.c */ 6a7 > modificado por Luis Miguel 14c15 < * CPUyES --- > * CPUyESmio 16c17 < #define MYNAME "CPUyES" --- > #define MYNAME "CPUyESmio"
Con 1c1, 13c11, etc. se indican los números de las dos líneas que tienen diferencias. El carácter < indica el contenido de la línea del primer fichero. El carácter > indica el contenido de la línea del segundo fichero. Con 6a7 se indica que en el segundo fichero hay una línea que no existe en el primero.
Borre el fichero CPUyESmio.c.
Los elementos del árbol de directorios tienen asociados unos permisos que definen las operaciones que pueden hacer los usuarios. Los permisos se definen mediante nueve bits, como se muestra en la figura:
El significado de estos bits, para ficheros normales, es el siguiente:
IMPORTANTE: En el caso de los directorios la tabla es parecida, sólo hay que sustituir Ejecución por Acceso.
Cada vez que un proceso (programa en ejecución) crea un fichero es necesario asignarle unos permisos. Para ello, el proceso solicita (al sistema operativo) la asignación de unos permisos concretos. En ciertos casos conviene limitar la capacidad del proceso de asignar cualquier permiso, así que el sistema operativo filtra la solicitud a través de una máscara de bits que contiene a 1 los permisos “prohibidos”, que nunca puede asignar el proceso. Los permisos del fichero se obtienen haciendo una operación “AND NOT máscara”: un AND lógico entre la máscara negada y los permisos solicitados. Cada proceso puede tener una máscara diferente. Si el proceso no especifica los permisos solicitados, por defecto solicita todos, es decir, 111 111 111.
El mandato umask nos permite conocer la máscara y cambiarla.
Ejecute umask.
alumno@maquinaLinux:~$ umask
Por ejemplo, la máscara 0022 =0 000 010 010 indica que se prohíbe la escritura al grupo y al mundo. Con estas condiciones creamos un fichero mediante el mandato sort. El mandato sort lee de la entrada estándar, ordena alfabéticamente las líneas leídas y las escribe por la salida estándar (aunque en este caso, se redirige la salida estándar al fichero Salida).
alumno@maquinaLinux:~$ sort > Salida Amelia Pedro Aurelio [Ctrl+D]
La combinación [Crt+d] indica fin de fichero, por lo que el mandato sort termina y genera el fichero Salida. Utilice el mandato cat, para ver que el fichero Salida está ordenado alfabéticamente. Observe los permisos del fichero Salida.
alumno@maquinaLinux:~$ ls -l S* -rw-r--r-- 1 alumno GrupoAlumno 21 Jul 25 13:38 Salida
En nuestro caso, la máscara ha actuado, prohibiendo la escritura al grupo y mundo. Como el fichero no es un ejecutable, los permisos de ejecución no están activos. Cambie la máscara.
alumno@maquinaLinux:~$ umask -S 0000 u=rwx,g=rwx,o=rwx alumno@maquinaLinux:~$ umask 0000
La máscara 0000 elimina todas las restricciones, por lo que no es adecuada. Ponga la máscara 0077, que prohíbe al grupo y mundo acceder a sus ficheros.
alumno@maquinaLinux:~$ umask -S 0077 u=rwx,g=,o=
Edite el fichero .bash_profile para introducir, por ejemplo, una línea con el mandato umask -S 0077
alumno@maquinaLinux:~$ pico .bash_profile
Arranque un nuevo shell y compruebe la máscara.
Borre la línea que acaba de insertar en el fichero.
El mandato chmod permite cambiar los permisos de un fichero. Cambie los permisos del fichero creado más arriba.
alumno@maquinaLinux:~$ chmod 0700 Salida alumno@maquinaLinux:~$ ls -l S* -rwx------ 1 alumno GrupoAlumno 21 Jul 25 13:38 Salida
Borre el fichero de este ejercicio.
Las variables de entorno mantienen información que está a disposición de los procesos que se ejecutan en el sistema.
Mediante el mandato env obtenemos las variables de entorno del proceso shell, variables que serán transmitidas a los procesos que se generen a partir de dicho shell. Dos variables muy interesantes son PATH y HOME. PATH define los directorios que se utilizan para buscar ejecutables. De esta forma no es necesario dar el nombre completo del ejecutable, basta con dar el nombre local y el sistema lo busca dentro de los directorios definidos en PATH. La búsqueda es ordenada de forma que si un programa está repetido se ejecutará el primero que se encuentre de acuerdo a la definición de PATH. HOME especifica el directorio home del usuario.
Ejecute env en su sistema.
alumno@maquinaLinux:~$ env TERM=xterm SHELL=/bin/bash SSH_CLIENT=81.36.1.115 1864 22 SSH_TTY=/dev/pts/1 USER=alumno MAIL=/var/mail/alumno PATH=/usr/local/sdk/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games PWD=/home/alumnosSSOO/alumno PS1=\u@\h:\w\$ JDK_HOME=/usr/local/software/j2sdk1.4.0 SHLVL=1 HOME=/home/alumnosSSOO/alumno LOGNAME=alumno SSH_CONNECTION=81.36.1.115 1864 138.100.9.35 22 _=/usr/bin/env
Se puede añadir o modificar el valor de una variable de entorno. Para ello basta con poner <nombre>=<dato>. Si la variable existe, se cambia su valor, si no existe, se crea con el valor <dato>.
Creamos una nueva variable de entorno. Esta variable es visible solamente en el proceso shell, no se heredará por los procesos que se lancen desde el shell.
alumno@maquinaLinux:~$ MIVAR=76
El mandato echo escribe por su salida estándar el valor de su parámetro. Para indicar una variable de entorno se precede su nombre del carácter «$».
Ejecute el mandatoecho para ver que la variable existe y conocer su valor.
alumno@maquinaLinux:~$ echo $MIVAR 76
Observe que si deja un blanco entre el «$» y el nombre de la variable de entorno el mandato echo lo toma como una cadena de caracteres y no como una variable
alumno@maquinaLinux:~$ echo $ MIVAR $ MIVAR
Ejecute otra vez el mandato env y verá que la nueva variable no aparece. Para incorporarla al entorno heredable se utiliza el mandato export. Ejecute:
alumno@maquinaLinux:~$ export MIVAR
Ejecute otra vez el mandato env y verá que ahora la nueva variable sí aparece.
alumno@maquinaLinux:~$ env TERM=xterm SHELL=/bin/bash SSH_CLIENT=81.36.1.115 1864 22 SSH_TTY=/dev/pts/1 USER=alumno MAIL=/var/mail/alumno PATH=/usr/local/sdk/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games PWD=/home/alumnosSSOO/alumno PS1=\u@\h:\w\$ JDK_HOME=/usr/local/software/j2sdk1.4.0 SHLVL=1 HOME=/home/alumnosSSOO/alumno LOGNAME=alumno SSH_CONNECTION=81.36.1.115 1864 138.100.9.35 22 _=/usr/bin/env MIVAR=76
No es recomendable modificar las variables de entorno, a menos que se sepa lo que se está haciendo.
(La realización de este apartado es opcional.)
Como ya hemos comentado anteriormente, una opción para realizar las prácticas es la conexión a una máquina remota Linux. Para facilitar estas conexiones remotas, desde una máquina Windows disponemos de una serie de aplicaciones que podrá descargar desde este sitio Web.:
La utilización de autenticación basada en clave pública y clave privada permite la conexión a sistemas remotos sin necesidad de recordar una clave de acceso para cada sistema. Sin entrar en profundidad en los conceptos teóricos, este tipo de autenticación se basa en la generación de un par de claves (una pública y otra privada). La clave pública deberemos publicarla en todos los sistemas a los que queramos acceder, mientras que la clave privada deberemos mantenerla protegida mediante password (para mayor seguridad) y no proporcionarla a nadie. Esto limita a la utilización de un único password (el de la clave privada) para el acceso a múltiples máquinas.
El procedimiento a seguir es el siguiente:
---- BEGIN SSH2 PUBLIC KEY ---- Comment: "dsa-key-20080221" AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== ---- END SSH2 PUBLIC KEY ----
ssh-dss AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== usuario@maquinaWindows
La mayoría de distribuciones Linux también incorporan la aplicación openSSH para la gestión de claves. El procedimiento es prácticamente el mismo, salvo que varían las aplicaciones involucradas en el proceso.
alumno@maquinaLinux:~> ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/alumnosSSOO/alumno/.ssh/id_dsa): /home/alumnosSSOO/alumno/.ssh/id_dsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/alumnosSSOO/alumno/.ssh/id_dsa. Your public key has been saved in /home/alumnosSSOO/alumno/.ssh/id_dsa.pub. The key fingerprint is: f5:6f:3f:9a:4b:9d:4a:bf:4f:69:0e:72:d3:94:fb:e5 alumno@maquinaLinux
De este modo, si listamos el contenido del directorio .ssh nos encontraremos con dos ficheros: id_dsa.pub, que contiene la clave pública e id_dsa que contiene la clave privada, protegida mediante la contraseña que hayamos establecido durante su creación.
alumno@maquinaLinux:~> ls -la ./.ssh total 20 drwxr-xr-x 2 alumno GrupoAlumno 4096 jul 9 16:41 . drwxr-xr-x 36 alumno GrupoAlumno 4096 jul 9 16:41 .. -rw------- 1 alumno GrupoAlumno 736 jul 9 16:41 id_dsa -rw-r--r-- 1 alumno GrupoAlumno 612 jul 9 16:41 id_dsa.pub