[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ siguiente ]


Comprendiendo el Sistema: Comandos Básicos
Capítulo 3 - Ficheros, cuentas y propietarios


3.1 Breve introducción a los ficheros en Unix

En Unix el concepto de fichero es más amplio que en otros sistemas operativos, aunque en esta sección nos restringiremos a su sentido más convencional y en la sección Ficheros especiales, Sección 3.3 hablaremos de los ficheros especiales. Un fichero no es más que la agrupación de un conjunto de información bajo un nombre que es el nombre del fichero. Esta información puede ser muy variada, yendo desde el texto hasta el programa ejecutable. Lo importante de Unix es que básicamente todo viene representado por ficheros: documentos, gráficas o programas. Los directorios, que estamos acostumbrados a asociar a contenedores de ficheros son en realidad ficheros que contienen... listas de ficheros. Incluso el lector de CDROM o de DVD, la disquetera, un lápiz de memoria y en general todos los dispositivos son para el kernel ficheros que se leen y a los que se escribe.

En algunos sistemas operativos todos los ficheros pueden ser modificados por cualquier persona que use el ordenador, de hecho, cualquier persona podría borrar el disco duro, intencionada o accidentalmente. En los sistemas Unix en general, y en losGNU/Linux en particular, esto es casi imposible siempre que se tengan en cuenta unas mínimas recomendaciones. La seguridad de un sistema Linux/UNIX comienza pues por mantener una política adecuada de permisos en los ficheros.

Hay que destacar que, como ya se ha comentado, los ficheros no se encuentran todos en el mismo lugar, sino que están organizados en distintos cajones o carpetas llamados directorios que a su vez pueden contener subdirectorios. Seguramente este concepto es bien conocido por todos los que han usado alguna vez un ordenador y es esencialmente el mismo para MS Windows, GNU/Linux o Unix. Para ilustrar el concepto de directorio podemos analizar la siguiente salida del comando ls:

      
     thorin@gondor:~$ ls /
     bbin/    dev/  floppy/  lib/         pp     sbin/  var/
     boot/   dos/  home/    lost+found/  proc/  tmp/   vmlinuz
     cdrom/  etc/  initrd/  mnt/         root/  usr/   vmlinuz.old

Se pueden ver todos los subdirectorios que cuelgan del directorio raíz del sistema, llamado /, que se distinguen fácilmente de los ficheros porque en el caso de los directorios el nombre termina con /. También pueden verse dos ficheros llamados vmlinuz y vmlinuz.old. Existen dos ficheros especiales que no se muestran en la anterior salida pero que están presentes en todos los directorios. Uno es . que hace referencia al directorio en el que nos encontramos y el otro es .. que hace referencia al directorio que contiene al directorio en el que nos encontramos (esto es, implica subir un escalón en el árbol de directorios). Así, ¿qué diferencia habría entre escribir ls o ls .? Pues ninguna ya que ambos comandos hacen un listado del directorio en el que nos encontramos. Y otra pregunta, ¿por qué al hacer ls ~ no aparece ninguno de los ficheros de configuración que habiíamos mencionado antes? La respuesta esta en man ls...

En Linux, para moverse a través de los distintos directorios hay dos comandos básicos, cd que nos permite cambiar de directorio y pwd que me dice en que directorio me encuentro. Por tanto podemos listar de nuevo el contenido del directorio raíz situándonos en dicho directorio:

      
     thorin@gondor:/$ cd /
     thorin@gondor:/$ pwd
     /
     thorin@gondor:/$ ls
     bbin/    dev/  floppy/  lib/         pp     sbin/  var/
     boot/   dos/  home/    lost+found/  proc/  tmp/   vmlinuz
     cdrom/  etc/  initrd/  mnt/         root/  usr/   vmlinuz.old

Siguiendo con el tema de los directorios y los subdirectorios, surge rápidamente pregunta de cómo hacer referencia a un fichero que se encuentra en un lugar concreto dentro del árbol de subdirectorios. Hay varias opciones, la primera es dar el camino (o path) absoluto: por ejemplo /etc/X11/Xsession (que es el fichero de configuración de la tarjeta gráfica). Otra forma es suministrar el camino de forma relativa al directorio en el que nos encontramos. Si soy el usuario thorin y me encuentro en mi directorio HOME que generalmente será /home/thorin, haré referencia al fichero anterior como ../../etc/X11/Xsession. Hay una variante para hacer esto, ya que el símbolo ~ se refiere al directorio home de un usuario, así también podré usar ~/../etc/X11/Xsession.

Conviene también destacar que si escribimos cd y no damos ningún argumento al comando nos trasladaremos a nuestro directorio home.

Un par de comandos básicos que más adelante explicaremos con detalle son cp y rm. El primero permite copiar y el segundo permite borrar ficheros. Para ver un ejemplo podemos volver al directorio home y copiar el fichero de configuración .bashrc en otro fichero llamado test_cp:

      
     thorin@gondor:~$ cd
     thorin@gondor:~$ cp .bashrc test_cp
     thorin@gondor:~$ ls test_cp
     test_cp
     thorin@gondor:~$ rm test_cp
     thorin@gondor:~$ ls test_cp
     ls: test_cp: No such file or directory

3.1.1 Midnight Commander

Para desplazarnos por los distintos directorios y hacer operaciones con los ficheros podemos trabajar en modo consola como se ha descrito en las anteriores líneas, pero también podemos usar algún tipo de interfaz gráfico, similar al Windows Explorer, como el Comandante Norton, que se corresponde con el comando mc o gmc. Sus principales características son las siguientes:

Por defecto, se tienen dos paneles con el listado de archivos de un directorio. Otro modo útil consiste en configurar la ventana derecha para que muestre toda la información referente a los archivos: permisos, tamaño, etc. Los siguientes son algunas teclas esenciales. Con el demonio gpm ejecutándose es posible también usar el ratón. Asegúrese de presionar la tecla Mayúsculas (Shift) para cortar y pegar en mc.

Cualquier comando cd cambiará el directorio mostrado en los paneles. Ctrl-Enter o Alt-Enter copiará el nombre de un archivo en la línea del comandos. Utilizad este atajo con los comandos cp o mv. La combinación Alt-Tab cumple el mismo rol que la tecla TAB en el shell. El editor interno sigue un esquema de cortar-y-pegar muy interesante. Con la tecla F3 se marca el comienzo de una selección, al volver a pulsar F3 se marca el fin de la misma y resalta el área elegida. A continuación se puede mover el cursor. Si pulsa F6 el área seleccionada se ubicará donde está el cursor. Presionando F5 el área se copiará e insertará en dicha posición. Al pulsar F2 se grabará el archivo. Con la tecla F10 se sale del editor. La mayoría de las teclas de desplazamiento funcionan en forma intuitiva. Existe un visor muy sofisticado. Es una excelente herramienta para buscar palabras en un documento. Pulse Enter sobre un archivo y el programa apropiado manejará el contenido del archivo. Esta es una característica muy útil del MC. Así, en función del tipo de archivo, se efectúa lo siguiente:


3.2 Permisos y usuarios

Hasta ahora hemos hablado de algunos aspectos de los ficheros y directorios, así como de su manejo, pero aún no se ha aclarado como el sistema Linux evita que podamos borrar ficheros de otros usuarios o incluso del sistema. Esto se consigue gracias a los permisos que tienen los ficheros y a que siempre pertenecen a un determinado propietario (también a un determinado grupo). Supongamos que el usuario thorin ejecuta el comando ls -l, desde uno de sus directorios.

      
     tirith:~/tmp$ /bin/ls -lh 
     total 19M
     -rw-r--r--    1 thorin    users    1.1M Jan 24 16:52 109_0913.jpg
     -rw-r--r--    1 thorin    users    164k Jan 25 20:08 1119.pdf
     -rw-------    1 thorin    users     14k Jan 12 17:20 2_docencia.xls
     drwxr-x---    4 thorin    users    4.0k Sep  2 06:35 Cprograms
     -rw-r--r--    1 thorin    users    104k Feb 10 10:32 cd_label.tiff.gz
     -rw-r--r--    1 thorin    users    136k Jan 17 19:13 thorincal.ics
     -rw-r--r--    1 thorin    users    8.1M Feb 14 14:09 empire-18.tgz
     -rw-r--r--    1 thorin    users     48k Jan 24 12:55 i1x0c000.gif
     -rwxr-x---    1 thorin    users    313k Feb  1 19:53 libMinuit
     drwxr-xr-x    2 thorin    users    4.0k Jan 19 21:54 Pat
     drwxr-sr-x    6 thorin    users    4.0k Sep 24 06:35 TeX

El comando en cuestión nos proporciona una salida en formato extendido (opción -l) y con el tamaño de los ficheros en unidades humanas (opción -h). Como puede observarse, además del nombre del fichero, como vimos que ocurría en el caso abreviado, aparece mucha más información. En particular, la primera columna se refiere a los permisos, la segunda al número de enlaces no simbólicos asociados al fichero (esto no nos interesa por ahora...) las dos siguientes proporcionan el nombre del propietario y del grupo asociados al fichero, la quinta al tamaño del fichero, la siguiente a la fecha de modificación del fichero y la última al nombre del fichero.

Algo que aún no hemos tratado es el concepto de cuenta de usuario. En principio una cuenta se corresponde con el directorio en el que el usuario está autorizado a poner sus ficheros, además cada usuario lleva asociado un password, y un conjunto de variables que definen su identidad dy cuáles son algunas de sus preferencias. Por defecto, cuando accede a la máquina, el usuario entra en su cuenta, es decir en su directorio, lo que hemos llamado hasta ahora directorio home.

En Unix existe, además del concepto de usuario, el de grupo de usuarios, o grupo a secas. Un usuario representa algo o alguien con permiso para el uso de ciertos ficheros. Tanto procesos del sistema como personas pueden considerarse como usuarios. De hecho incluso existe un usuario llamado nobody (nadie).

Por ejemplo una cuenta de usuario llamada webmaster suele pertenecer a la persona responsable de los sitios Web de un nodo, mientras que la cuenta de usuario lp es usada por el demonio de impresión lpd, que corre como si fuera el usuario lp.

Un grupo no es más que una lista a la que pueden pertenecer diferentes usuarios, cada usuario pertenece a un grupo principal, pero de hecho puede pertenecer a tantos otros grupos como sea necesario. Por ejemplo, en una máquina puede existir un grupo llamado users, que sea un grupo general de usuarios, al que pertenezca el usuario webmaster. Pero este usuarios también puede pertenecer al grupo admin de usuarios con algunos privilegios para llevar a cabo tareas de administración.

La información acerca de usuarios y grupos se encuentra en los ficheros /etc/passwd y /etc/group. Por ejemplo, la definición de un usuario llamado juanluis en el fichero /etc/passwd tiene el aspecto siguiente:

     juanluis:x:2001:201:Juanlus Zerep,,,:/home/juanluis:/bin/bash

y la entrada en /etc/group donde se define su grupo sería

     profesores:x:201:juanluis,robin,berto

En la línea correspondiente al ficherio passwd hay varias entradas separadas por dos puntos. La primera corresponde al username o nombre del usuario, la segunda, ocupada por una x, corresponde a la contraseña o passwd (que en realidad se encuentra encriptado y almacenado en el fichero /etc/shadow) del usuario, en tercer lugar encontramos el número de identificación del usuario o UID, en este caso 2001. En cuarto lugar tenemos el número de identificación del grupo al que pertence el usuario o GID (201). El resto de campos nos dan: el nombre del usuario (Juanlus Zerep), su directorio HOME (/home/juanluis) y la shell en la que entra por defecto (/bin/bash) al hacer login. Hay que destacar que un usuario no puede, en principio, escribir en la cuenta de otro ni borrar sus ficheros. Además, tampoco podrá modificar ficheros de otros usuarios, aunque estos no estén propiamente en su cuenta. Para comprobar esto, pruebe a correr rm -r /root[1]. Verá que recibe un mensaje similar a:

     thorin@gondor:~$ rm -r /root/
     rm: descend into write-protected directory `/root/'? y
     rm: cannot chdir from `.' to `/root/': Permission denied

Es decir no puede borrar la cuenta del root que, por cierto, es la cuenta del superusuario.

Por supuesto, no intente hacer rm -r * en su directorio Home, ya que en este caso S\'I borrará su cuenta. Y sin vuelta atrás. O casi, pero eso ya es otra historia.

Espero que haya quedado claro, que es muy difícil borrar información de un sistema Linux a menos que se tengan los permisos adecuados. A continuación veremos como se examinan los permisos y se alteran, pero hay dos cosas muy importantes a tener en cuenta. La primera es que el usuario root puede hacer todo cuanto quiera: básicamente los permisos no lo afectan. Es por tanto muy importante no usar la cuenta root a menos que sea imprescindible, y cuando se use hacerlo con sumo cuidado. La segunda cuestioón a tener en cuenta es llevar una política adecuada de permisos, lo que constituye un paso importante para incrementar la seguridad del sistema.

Queda pendiente una cuestión: imaginemos que en un sistema Linux un usuario recibe un virus y lo activa, aunque fuese muy improbable -lo primero, no lo segundo-, ¿podrá borrarse todo el disco duro?

¿Como se interpretan los permisos de un fichero? La información que nos proporciona ls -l es algo similar a -rwxr-xr-x o a drwxr-x---, como podemos ver en el ejemplo proporcionado anteriormente:

     -rwxr-x---    1 thorin    users    313k Feb  1 19:53 libMinuit
     drwxr-xr-x    6 thorin    users    4.0k Sep 24 06:35 TeX

Los permisos vienen indicados de la siguiente forma: el primer carácter indica si se trata de un fichero (-) o un directorio (d). Así pues, TeX es un directorio mientras que libMinuit es un fichero. A continuación, la información se reparte en tres grupos de tres elementos cada uno. Estos grupos corresponden a los permisos para el usuario (el propietario del fichero, thorin en este caso), el grupo (users) y para el resto de los usuarios, que no pertenecen al grupo. Por ejemplo, para el fichero libMinuit los permisos asociados a estos tres grupos son: usuario rwx, grupo r-x y resto del mundo ---. Dentro de cada uno de estos grupos, r significa permiso para leer, w permiso para escribir o borrar y x permiso para ejecutar. Así pues, en el caso de libMinuit, el usuario thorin puede ejecutar el programa, leerlo o modificarlo, mientras que los usuarios del grupos users pueden leerlo o ejecutarlo, pero no modificarlo. Por último el resto de usuarios no puede ni leer ni ejecutar ni modificar el fichero.

En caso de que estemos examinando un directorio los permisos de lectura y modificación tienen idéntico significado que para un fichero normal. Sin embargo, el permiso de ejecución tiene un significado distinto. Tener activado el permiso x en un directorio implica que es posible entrar en dicho directorio y hacerlo el directorio de trabajo con el comando cd, o atravesarlo para entrar en alguno de sus subdirectorios. Por tanto en el caso de nuestro ejemplo el usuario thorin tiene todos los permisos para el directorio TeX mientras que el tanto los usuarios del grupo users como el resto de usuarios no pueden modificarlo, pero sí entrar en ellos y examinar su contenido.

Es posible modificar los permisos de un fichero o directorio que sean de nuestra propiedad (o para los que tengamos activado el permiso de escritura w), con la instrucción chmod. Por ejemplo, si queremos que el fichero libMinuit pueda ser leído, modificado y ejecutado por todo el mundo (generalmente no es la mejor poítica, pero bueno...), escribiremos:

     thorin@gondor:~$ chmod a+rwx libMinuit
     thorin@gondor:~$ ls -l libMinuit
     -rwxr-xrwx    1 thorin    users    313k Feb  1 19:53 libMinuit

Si por ejemplo queremos permitir el acceso al directorio TeX únicamente al usuario thorin tendremos que eliminar los permisos que tiene el grupo (g) y el resto de usuarios (a) haciendo

     thorin@gondor:~$ chmod g-rx TeX
     thorin@gondor:~$ ls -l 
     drwx------    6 thorin    users    4.0k Sep 24 06:35 TeX

Por último, si queremos cambiar los permisos del propietario utilizamos para referirnos a este la clave u así que si queremos eliminar todos los permisos de ejecución del fichero libMinuit haremos

     thorin@gondor:~$ chmod uga-x libMinuit
     thorin@gondor:~$ ls -l libMinuit
     -rw-r--rw-    1 thorin    users    313k Feb  1 19:53 libMinuit

Recomendamos al alumno que lea con atención la información proporcionada por man chmod y practique con esta instrucción, teniendo en cuenta que los permisos se conceden usando + y se quitan con -.


3.3 Ficheros especiales

Ya comentamos en la anterior sección el concepto de fichero en Unix es mucho más amplio que en otros sistemas operativos. El punto clave está en que todos los periféricos y dispositivos del sistema se representan mediante un fichero especial, que se llama fichero de dispositivo y que aparece en el directorio dev/dev. Un listado parcial de este directorio muestra algo similar a esto:

     thorin@gondor:~$ ls -l /dev
     total 84
     lrwxrwxrwx 1 root root         10 2004-10-29 23:30 adsp ->/dev/adsp0
     crw-rw---- 1 root audio   14,  60 2004-10-29 23:30 adsp3
     crw-rw---- 1 root video   10, 175 2004-10-29 20:31 agpgart
     brw-rw---- 1 root cdrom   29,   0 2004-09-18 13:53 aztcd0
     lrwxrwxrwx 1 root root          8 2004-10-29 20:37 cdrom ->/dev/hdc
     brw-rw---- 1 root floppy   2,   0 2004-09-18 13:53 fd0
     brw-rw---- 1 root disk     3,   0 2004-09-18 13:51 hda
     brw-rw---- 1 root disk     3,   1 2004-09-18 13:51 hda1
     brw-rw-rw- 1 root cdrom   22,   0 2004-09-18 13:51 hdc
     brw-rw---- 1 root disk    22,  64 2004-09-18 13:51 hdd
     brw-rw---- 1 root disk    22,  65 2004-09-18 13:51 hdd1
     brw-rw---- 1 root disk     8,   0 2004-09-18 13:51 sda
     ...

donde se ve que los campos no son exactamente iguales que en un fichero normal. Por ejemplo, muchos de estos ficheros no ocupan espacio alguno. Los discos duros y lectores de CDROM se corresponden con los ficheros /dev/hdx o /dev/sdx. La disquetera se corresponde con /dev/fd0. El puerto paralelo se corresponde con /dev/lp. El primer puerto serie se corresponde con /dev/ttyS0.


[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ siguiente ]


Comprendiendo el Sistema: Comandos Básicos

Version 0.01

Curro Pérez Bernal francisco.perez@dfaie.uhu.es