Práctica 1 - Introducción A Linux
Práctica 1 - Introducción A Linux
Práctica 1 - Introducción A Linux
Práctica 1
Introducción a Linux
Objetivos
El objetivo principal que se persigue en esta práctica es que el alumno se familiarice con
el entorno de trabajo en el que se desarrollarán las prácticas posteriores: Linux.
En esta primera parte aprenderá a usar el sistema operativo Linux. Gran parte de los
conceptos no son específicos de Linux sino que pueden aplicarse igualmente a cualquier
sistema operativo de tipo UNIX. Además se aprenderá a controlar los procesos que ha
lanzado su usuario y a modificar los permisos de sus ficheros.
Cada cuenta permite a su usuario utilizar una máquina UNIX con diferentes privilegios
que otros usuarios, pudiendo acceder sólo a los ficheros que sean propiedad de ese
usuario y utilizando las aplicaciones que se permitan a ese usuario. Hay una cuenta
especial en las máquinas UNIX que es la cuenta del administrador del sistema. Esta
cuenta se llama normalmente rooty tiene permisos para hacer cualquier cosa en el
sistema.
El primer paso, por tanto, para usar un sistema UNIX es conseguir una cuenta.
Si estás en una de las mesas con armarios de prácticas. Cada grupo de prácticas
dispone de varios ordenadores con Linux etiquetados como PC A, PC B, PC C y PC SC.
Los Pcs A, B y C se usarán en las prácticas que utilicen la red y la cuenta de usuario se
proporcionará cuando sea necesario. En esta primera práctica utilizaremos el PC
SC, este PC está bien configurado en red y utiliza el sistema de cuentas central del
Laboratorio de Telemática, a cada grupo de prácticas se le ha asignado una cuenta que
le permite utilizar cualquiera de los Pcs SC o de los ordenadores de propósito general
del laboratorio. Esta cuenta se llamará arss<número_de_grupo> y el profesor
comunicará la contraseña en clase.
Si estás en una mesa con un solo ordenador por grupo no hace falta que te preocupes
por la selección de ordenador.
En cualquier caso observa que el ordenador presenta una pantalla de login gráfico.
Entra utilizando tu cuenta y contraseña en el login de modo texto. Una vez identificado
mediante usuario y contraseña, el sistema ha lanzado un proceso que recibe las
órdenes que tecleas y las interpreta, lanza los programas que sean necesarios para
cumplirlas y muestra los resultados en pantalla. Este programa se llama genéricamente
shell, y hay varias shells diferentes disponibles normalmente en los sistemas UNIX que
el usuario puede elegir. En el Linux que estás usando si el usuario no elige lo contrario
está usando la shell llamada bash. Otras shells típicas son csh, tcsh, kshy sh.
La shell permite escribir nombres de programas que serán lanzados por la propia shell.
UNIX es un sistema operativo multitarea que puede tener varios programas
funcionando al mismo tiempo. A cada programa que está siendo ejecutado le llamamos
proceso. Así pues, cuando se escribe algo en la shell y se pulsa ENTER, se lanza un
nuevo proceso con el programa que se ha introducido. La shell se queda esperando a
que el proceso termine y vuelve a preguntar por otro comando.
2
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
correctamente antes de salir. Usa otro terminal para comprobar que puedes entrar
con la nueva contraseña. Tras esto, sal tecleando exity pulsando ENTER..
Nota importante: Tenga en cuenta que tener los ordenadores con contraseñas
conocidas es un problema grave de seguridad, así que las cuentas que sigan teniendo
la misma contraseña se considerará que no tienen propietario y serán eliminadas.
Al terminar de usar una máquina UNIX debes indicar a la shell que ya no quieres hacer
más operaciones para que termine y vuelva a pedir login al siguiente usuario. Esto es
muy importante por motivos de seguridad. Si olvidas cerrar la sesión cualquiera delante
de ese ordenador puede acceder a tu cuenta, lo que implica que puede borrar todos tus
ficheros o usar todos los privilegios de tu cuenta. Acuérdate siempre de dejar un
ordenador UNIX en la pantalla de login igual que cuando entraste.
Primeros pasos
Si tienes el terminal en modo texto, sal de la cuenta con exit. Utiliza Control+Alt+F8
para obtener el login gráfico y entra en tu cuenta en modo gráfico.
Localiza un navegador web en el que puedas pedir la página de la asignatura para poder
seguir las prácticas a partir de ahora.
Localiza el navegador del sistema de ficheros de UNIX en el que podrás ver de forma
gráfica tu directorio home y moverte por los directorios y subdirectorios.
Localiza al menos un editor de texto plano para editar ficheros de texto (no confundir
con un editor de texto con formato tipo OpenOffice). Al menos deberías encontrar
gedito kate, pruébalos.
Localiza un terminal en el que puedas abrir una ventana de comandos con una shell con
la ventaja de que puedes tener varias abiertas simultáneamente.
Pero para empezar a conocer UNIX es mas educativo aprender algunos conceptos más
sobre el terminal y la shell. Abre un terminal con lo que obtendrás una shell en una
ventana.
Manejando ficheros
Los sistemas UNIX al ser multi-usuario requieren que cada cuenta de usuario pueda
tener diferente acceso a los directorios y ficheros. Nada más entrar la shell está
esperando ordenes y está posicionada en el directorio home del usuario. Observa cuál
es tu directorio home con el comando
$ pwd
3
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
$ cat > unfichero
escriba algo
^D (pulsar control+D)
$ touch fichero_tres
Usa el comando lspara comprobar que se han creado y los comandos siguientes para
ver su contenido:
$ cat unfichero
$ more fichero1
$ less unfichero (para salir pulsa q)
El sistema de ficheros soporta una serie de permisos que dicen quién tiene derecho a
usar o no cada fichero. Puedes ver estos permisos con el comando ls. Puedes
consultar todas las opciones de un comando mediante el sistema de ayuda de UNIX
proporcionado por el comando man, por ejemplo man ls.
El primer bloque de letras y guiones en cada línea indica los permisos sobre el fichero.
La primera letra indica el tipo de fichero. Las 9 restantes se pueden considerar en
grupos de 3. Cada grupo indica los permisos que tienen diferentes tipos de usuarios.
Ejemplo:
[] [rw] [r] [r] 1 usuario staff 41685513 Sep 27 13:57 usuario.tgz
[d] [rwx] [rx] [rx] 3 usuario staff 4096 Dec 16 08:14 Desktop
4
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
Los permisos para cada tipo de usuario se componen por tanto de un bloque de 3
letras que pueden ser r w xo bien en lugar de la letra puede haber un (hay más
posibilidades para ciertos casos especiales que no detallaremos en este momento).
Cada letra significa una operación. Si está la letra quiere decir que ese usuario tiene
permiso para hacer esa operación y si está el guion quiere decir que no tiene permiso.
Las operaciones son ligeramente diferentes según se trate de ficheros o directorios.
Puede verlas en la siguiente tabla
Por otra parte el sistema operativo debe decidir qué bloque de permisos debe aplicar a
un usuario que intenta acceder a un fichero. Para ello todos los ficheros tienen un
usuario y un grupo al que pertenecen. Todos los ficheros del ejemplo son del usuario
usuario y del grupo staff, es decir para acceder al directorio Desktop, al usuario
usuario se le aplican los permisos del propietario rwx (puede hacer cualquier
operación), a los usuarios que pertenezcan al grupo staff se les aplica el segundo
bloque rx(pueden leer y acceder al interior pero no modificarlo) y a todos los demás
usuarios se les aplica el ultimo bloque rx. Practica un poco siguiendo las siguientes
instrucciones.
Prueba a editar con editores de terminal de texto alguno de los ficheros. Hay varios
editores de texto de línea de comandos en un UNIX típico. Prueba por ejemplo:
$ pico unfichero
$ nano unfichero
5
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
$ vi unfichero
$ emacs unfichero
Los primeros son más fácil de usar para un usuario de hoy en día por su sencillez. Los
dos últimos son clásicos en la historia de UNIX y son muy completos a la vez que más
complejos. Normalmente utilizarás editores en el entorno gráfico pero siempre es útil
saber defenderse en cualquiera de estos para las ocasiones en las que no puedas usar
un interfaz gráfico (o la máquina no dispone del mismo, por ejemplo un router o casi
cualquier sistema embebido). Si te quedas atascado puedes salir de vipulsando ESCy
luego escribiendo :q!y ENTER. Para salir guardando cambios escribe :wq!.Y de emacs
pulsando Controlxy luego Controlc(también se suele indicar como ^X^Co Cx,
Cy).
También puedes usar el terminal para lanzar editores gráficos. Prueba a ejecutar:
$ gedit unfichero &
Ahora puedes volver a pensar en los permisos de los ficheros. Cambia los permisos del
propietario del fichero. Podemos quitar el permiso de escritura con el comando chmod.
Escribe:
$ chmod uw unfichero
Comprueba si quitar el permiso de escritura impide borrar un fichero. Usa los comandos
cppara copiar y rmpara borrar
$ cp unfichero fichero2
$ chmod uw fichero2
$ rm fichero2
¿Se ha borrado fichero2? ¿A qué se debe ésto? ¿Cómo podemos conseguir protegerlo?
6
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
El comando pssin opciones muestra sólo los procesos asociados a la misma terminal.
Como puede ver al lanzar ps, vemos dos procesos, uno es el proceso pspropiamente
dicho, el otro es el proceso que está corriendo bash.
bashno es más que un programa. Para comprobarlo intenta lanzarlo. Algo así:
$ bash
$
¿Cómo puedes cerrar el segundo bashy volver al primero? A estas alturas debes de
7
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
Puedes probar también otras shells diferentes, los tradicionales se llaman sh, ksh, csh,
tcshy bash. Los dos últimos que son los más modernos e incluyen todo lo que incluían
los demás (tcses una evolución de cshy bashes una evolución de sh/kshasí que hay
más bien dos familias). Verás que tu Linux no lleva ksh.
Como recordarás la función principal del shell permitir lanzar programas (comandos) y
comunicarse con ellos. En UNIX los programas tienen una entrada estándar de la que
reciben datos llamada stdin y una salida estándar llamada stdout en la que se
representan los datos que generan. (Para los usuarios avanzados diremos que también
hay una salida de errores diferente de la salida estándar pero eso dejaremos que lo
aprendas por su cuenta cuando conozcas más UNIX)
Por defecto la entrada estándar de la shell y de cualquier proceso que se lance desde
ella es el teclado y la salida estándar será la pantalla. Pero gran parte de la flexibilidad de
uso de programas desde la shell viene de que podemos cambiar o redirigir estas
entradas y salidas.
Para redirigir la salida de un comando hacia un fichero podemos usar el símbolo >
seguido del nombre del fichero detrás de un comando. Por ejemplo
$ date
$ date > fichero1
$ more fichero1
$ cal > fichero1
$ more fichero1
También podemos redirigir la salida con el símbolo >>lo que tiene un efecto un poco
diferente. Descúbre tú mismo...
$ date >> fichero1
$ more fichero1
$ cal >> fichero1
$ more fichero1
La entrada se redirige con el símbolo <. Por ejemplo puedes contar las palabras o las
líneas de un fichero lanzando el comando wc
$ wc w < fichero1
$ wc l < fichero1
Prueba también el comando grepque permite buscar líneas que contengan una cadena
determinada:
$ grep linea
Este programa busca líneas que contengan la cadena linea observa que repite
automáticamente las líneas en las que encuentra algo. Consulta la ayuda de este
comando ejecutando man grep.
Prueba a usar el comando grep para encontrar todas las líneas del fichero
/etc/servicesque contengan el texto "80" utilizando la redirección de entrada.
8
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
entrada del siguiente. Esto se conoce en UNIX como usar una pipe (tubería) y se hace
con el símbolo |
Como veremos más adelante esto permite encadenar programas que realizan
procesados simples sobre ficheros para lograr una tarea mayor combinando
procesados. De momento veamos qué se puede hacer con los comandos que
conoces...
$ date | wc c
$ ls l | wc l
$ cat /etc/services | grep web | wc l
También se puede usar una combinación de redirecciones. Por ejemplo podemos usar
el comando cat para copiar un fichero redireccionando la entrada y la salida. El
comando caten realidad lo único que hace es leer su entrada estándar y copiarla a su
salida estándar. ¿Cómo copiarías un fichero con éso?
Otra utilidad de la shell es que permite especificar nombres de ficheros que cumplan un
patrón determinado mediante el uso de comodines. Los comodines nos permiten
especificar una cadena que se comparará con los nombres de ficheros y se sustituirá
por todos los nombres que coincidan. Así podemos usar el comando:
$ ls /etc/s*
Para listar todos los nombres de ficheros que empiezan por /etc/s. Los comodines
que se permiten son los siguientes:
* cualquier cadena, incluyendo la cadena vacía
? cualquier caracter
[...] cualquiera de los caracteres entre [ y ]
Con un solo comando, lista los ficheros del directorio /usr/libque empiecen por lib,
liste también los ficheros de /etcque terminen en .conf.
9
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
Mira el manual del comando ps. Dado que al comando sólo se le pasan opciones, ha
evolucionado hasta no utilizar el delante de ellas. Estas son las combinaciones más
útiles. Averigua qué hacen:
$ ps
$ ps ax
$ ps axu
$ ps axw
$ ps axl
$ ps axj
Los procesos en UNIX son lanzados por otros procesos. Se dice que un proceso se
bifurca (fork) y crea un proceso hijo. Por tanto los procesos se agrupan en una
jerarquía de descendientes. Por ejemplo todos los procesos que lance desde su
terminal serán hijos del proceso shell que está usando.
Al consultar el manual de psya habrás visto que algunos de los comandos anteriores te
muestran el identificador del proceso y también el identificador del proceso padre.
Puedes probar también estas opciones de psque dejan más clara la relación
$ ps ef
No te asustes por la multitud de opciones. Al final sabrás las que usas más
habitualmente y miras el manual si necesitas algo concreto. Pero al menos recuerda
una forma de listar todos los procesos de la máquina. Para ello practica un poco
siguiendo los pasos que vienen a continuación:
¿Cómo podrías hacer un comando que muestre una línea por cada proceso sleepque
está corriendo en la máquina?
Como has visto, un proceso corriendo no devuelve el control a la shell hasta que
termina, de forma que un proceso largo que se lanza en una terminal la bloquea hasta
que acabe. Esto no supone mucho problema si estamos en el modo gráfico ya que
podemos lanzar más terminales. En cualquier caso, un proceso que está corriendo en
la terminal se dice que está corriendo en primer plano (foreground). No todos los
procesos que están corriendo en un UNIX han sido lanzados por un terminal. Un
proceso corriendo de fondo (background) funciona independientemente de las acciones
del usuario. Se entiende que debe estar preparado para no necesitar datos del teclado
ni esperar imprimir en la terminal. Para lanzar un proceso que no bloquee el terminal
debes añadir un &al final del comando.
10
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
$ ( sleep 30 ; echo "fin" )
Los paréntesis nos permiten agrupar varios procesos que se lanzan en una shell aparte
como si fuera un comando. Mira con ps si quieres saber lo que está pasando. El
comando esperará 30 segundos y escribirá fin. Puedes parar el programa con
Control+c(a veces lo verás escrito como ^C).
Verás que vuelves a tener el control del terminal y se indica el número de proceso que
se le ha dado al comando. Obsérvalo con el comando ps.
Los procesos pueden recibir señales mediante el comando kill y permiten cierto
control sobre ellos. Se llama así porque la señal que envía por defecto causa
(normalmente) que el proceso que la recibe termine y sea eliminado de la tabla de
procesos. La sintaxis básica es
$ kill nombre_de_la_señal PID
$ kill numero_de_la_señal PID
11
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
$ kill 9 pid
Un usuario sólo puede mandar señales a sus procesos y sólo el superusuario (root) es
capaz de mandar señales a cualquier proceso de cualquier usuario.
Si tienes el navegador abierto prueba a buscar el proceso que lo controla y deténlo con
un kill.
También puedes utilizar el comando killall que a veces es más cómodo. Mira el
manual para ver cómo funciona. Pero killalles también más peligroso, ¿por qué?
Usando la red
Quizás llegados a este punto te preguntarás ¿Por qué tengo que aprender a manejar
esto con comandos de texto si hay todo este interfaz gráfico? La respuesta es porque
está aprendiendo UNIX por su uso en redes de comunicaciones como Internet. Ahora
está sentado delante de la pantalla del ordenador que está manejando pero no siempre
va a ser así. Al usar un ordenador de forma remota el interfaz gráfico la mayoría de las
veces no es una opción. Por otro lado, como ya hemos comentado brevemente, los
sistemas UNIX se emplean hoy en día en muchos equipos que no necesitan ni tienen la
capacidad de tener instalado y ejecutar todo lo necesario para un interfaz gráfico (por
ejemplo muchos routers, set-top-boxes y otros dispositivos embebidos). Finalmente,
no desprecies la potencia y velocidad que puede ofrecer la línea de comandos a la hora
de automatizar tareas, comparada con prácticamente cualquier interfaz gráfico.
Para finalizar esta practica se mostrará el uso de los sistemas UNIX de dos aplicaciones
sencillas pero fundamentales de red. En primer lugar observa que tu ordenador está
conectado a una red de área local (LAN). Ya hemos visto que la información de las
cuentas reside en un ordenador central y del mismo modo tu directorio home está
exportado por un servidor de discos y montado en todas las máquinas del laboratorio
de forma que puedes ver tus ficheros aunque el próximo día te sientes en otro
ordenador. Pero veamos un uso más claro de la red.
Seguramente será algo así como tlm43. También puedes averiguar la dirección IP
consultando el comando ifconfigo el comando ip:
$ ifconfig eth0
eth0 Link encap:Ethernet direcciónHW 00:24:8c:b7:79:4c
Direc. inet:10.1.1.43 Difus.:10.1.255.255 Másc:255.255.0.0
Dirección inet6: fe80::224:8cff:feb7:794c/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:16431 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:650 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:1575272 (1.5 MB) TX bytes:67243 (67.2 KB)
Interrupción:18 Dirección base: 0x6c00
$ ip f inet addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP …
12
ARQUITECTURA DE REDES, SISTEMAS Y SERVICIOS
Área de Telemática, Departamento de Automática y Computación
Universidad Pública de Navarra
inet 10.1.1.43/16 brd 10.1.255.255 scope global eth0
La primera vez que te conectes pedirá que confirmes la identidad del servidor. Una vez
confirmada, las siguientes veces que se conecte a ese ordenador solo verificará que es
el mismo sin preguntar. Seguidamente deberá probar tu identidad con tu contraseña y
tendrás una sesión de shell remota establecida. En estas condiciones, que son las
normales cuando se trabaja con servidores en Internet, son útiles las habilidades de
línea de comandos de los primeros apartados.
Prueba el comando whopara ver quién más está usando ese ordenador. Comprueba
haciendo ping al ordenador en el que está sentado que el tiempo de respuesta es
mayor que desde un terminal en dicho ordenador.
13