cabecera d-xl

Comandos en Linux: Terminales, entrada y cambio de contraseña


A cada dispositivo que permite a un usuario interactuar con una máquina se le llama terminal. Los dispositivos que controlan los terminales se designan con la palabra tty (TeleTYpe).

En GNU/Linux existe una emulación de varios terminales sobre un único monitor. Se denominan terminales virtuales . Para cambiar de un terminal virtual a otro se pulsa Alt-F1, Alt-F2, Alt-F3, etc o bien Ctrl-Alt-F1,Ctrl-Alt-F2,Ctrl-Alt-F3, etc, bajo X-Windows. De este modo tendremos acceso a los terminales /dev/tty1, /dev/tty2..., respectivamente. En cada uno de estos terminales puede mantenerse una sesión de trabajo distinta, incluso de usuarios distintos. usuario diferente. Se pueden definir hasta 12 terminales de texto. La configuración por defecto es de 6 terminales de texto (hasta Alt-F6) y se deja Alt-F7 para acceder a X-Window. Dentro del entorno gráfico uno puede a su vez arrancar tantos emuladores de terminal de texto como se desee.

Generalmente en una consola (terminal virtual) de texto se muestra al inicio información del nombre de la distribución y su versión, la versión del núcleo seguida de la arquitectura de la máquina, el nombre que se le asignó al sistema en la instalación (el de mi ordenador es siff) y la palabra login:
Red Hat Linux release 9 (Shrike)
Kernel 2.4.19 on an i686
siff login:

En el login se introduce el nombre del usuario del sistema y la contraseña o password. Si ambos son válidos, se establecerá una conexión y se mostrará el prompt. El prompt es una indicación que muestra el intérprete de comandos para anunciar que espera una orden del usuario.

Terminales virtuales y /etc/inittab

La información necesaria para arrancar los distintos terminales virtuales se encuentra en el fichero /etc/inittab. Las líneas relevantes son estas:
1:2345:respawn:/sbin/mingetty tty1
(...)
6:2345:respawn:/sbin/mingetty tty6

Para añadir una terminal basta con copiar una de las líneas más abajo en el fichero, cambiando el primer y el último número por el del número de terminal que deseemos por ejemplo,  8:2345:respawn:/sbin/mingetty tty8). La estructura de una línea en el inittab es la de una serie de campos separadas por : (dos puntos). El primero es un identificador de la línea, el segundo corresponde a los niveles de ejcución, el tercero indica una acción, en este caso respawn, que significa que el programa a ejecutar (cuarto campo) debe reiniciarse siempre que sea apagado. Así que cada consola tiene un identificador igual a su número, se activa cuando se entra en los niveles 2,3,4, o 5 y está gobernada por el programa mingetty en el directorio /sbin. Además, cuando uno sale de una consola (pulsando Ctrl-D o tecleando exit) el comando se vuelve a ejecutar y la consola renace. ¡Pruébalo!.

Un nivel de ejecución (runlevel) está caracterizado por los servicios que se ejecutan cuando se está en él. Cuando GNU/Linux arranca, mira en el fichero inittab cuál es el nivel de ejecución por defecto (initdefault) y luego se dirige a /etc/rc.d para iniciar o cerrar los servicios pertinentes.

Intérpretes de comandos (sh, tcsh, ksh, bash)

El programa que se arranca una vez hecho el login o entrada en el sistema es un intérprete de comandos

El intérprete de comandos (o shell) es el programa que recibe lo que se escribe en el terminal y lo convierte en instrucciones para el sistema operativo. También se encarga de completar las líneas de comandos, expandir los comodines (*,?,...) y, como todo lenguaje de programación, dispone de instrucciones para la repetición de comandos o su realización condicional.

A continuación se destacan aquellos que han alcanzado mayor difusión:

  • El shell de Bourne (sh): es el shell original de UNIX. Ofrece al usuario una herramienta de programación poderosa. Su principal defecto es que no proporciona ayuda al usuario al introducir los mandatos.
  • El C-shell (csh): Fue desarrollado en la Universidad de Berkeley. Su sintaxis recuerda al lenguaje de programación C. Incluye ayuda para el usuario. El shell tcsh es una versión mejorada.
  • El shell de Korn (ksh): Se desarrolló en AT&T. A diferencia del resto de los comentados aquí, no es de libre distribución.
  • El shell de GNU (bash: Bourne-Again-Shell). El diseño es similar al del shell de Korn, pero en este caso, se trata de un programa de libre distribución que ha sido adoptado como intérprete de comandos para GNU/Linux

En tu sistema encontrarás bash, como "bash" y como "sh", tcsh bajo los nombres "csh" y "tcsh" y sh bajo el nombre "ash". Los intérpretes de comandos están en la ruta /bin. Tecleando ls -l /bin en una terminal podrás ver los enlaces simbólicos sh->bash y csh->tcsh.

Ficheros y directorios

El programa que se arranca una vez hecho el login o entrada en el sistema es un intérprete de comandos.

En Unix, y por lo tanto en Linux, todo es un archivo. El teclado, el monitor, el disco duro y hasta la memoria son tratados por el sistema operativo como archivos. De esta manera se utilizan los mismos métodos de apertura, escritura, lectura y cierre para todos ellos. La clase de archivos que acabamos de ejemplificar se es la de los archivos de dispositivos, y residen en la ruta /dev.

En DOS sólo se pueden ejecutar aquellos archivos con extensión .EXE . COM o .BAT. En Linux cualquier archivo puede ser ser ejecutable sin importar la extensión que tenga. El carácter ejecutable no lo confiere pues ninguna característica del nombre, sino que lo establece un atributo del sistema de ficheros, que hay que fijar mediante el comando adecuado.

El nombre de los archivos no está limitado como en DOS a 8 caracteres seguido de 3 caracteres de extensión. Puede tener puntos, guiones y demás símbolos como separadores. La longitud puede ser de 255 caracteres. No se puede asignar a un archivo el nombre / porque así es como se denomina al directorio raíz (el padre de todos los demás). NULL tampoco se puede utilizar porque se usa para representar "nada".

Árbol de directorios

  • /bin: aquí residen la mayoría de los programas esenciales para el arranque y funcionamiento del sistema (ls, pwd, mount, umount,...). Es la abreviatura de la palabra binaries(binarios, normalmente ejecutables). Cuando se usa el comando cp, se está ejecutando el programa /bin/cp.
  • /boot: contiene ficheros estáticos para el arranque del sistema.
  • /home: alberga los directorios personales de todos los usuarios. En un sistema recién instalado, si no se ha añadido ningún usuario, estará vacío.

Por ejemplo, /home/juan es el directorio del usuario juan.

  • /etc: aquí se encuentran los ficheros de configuración del sistema.

Por ejemplo, /etc/passwd es una pequeña base de datos de los usuarios autorizados en el sistema. Contiene el directorio de inicio de cada usuario (que normalmente está en /home, el intérprete de comandos que usará, su identificador y el de su grupo (UID, GID respectivamente), etc.

  • /lib: Librerías compartidas esenciales. Estos ficheros contienen código que compartirán muchos programas, evitando que cada uno tenga una copia para sí. Así se reduce el espacio usado en disco.
  • /dev: Los ficheros de dispositivos de los que hablábamos, que se usan para acceder a los dispositivos del sistema y recursos, como discos duros, modems, memoria, etc.

Nota: /etc contiene una gran base de datos de configuración, distribuidos en múltiples archivos de texto plano organizados jerárquicamente según una estructura de directorios. Lo esencial es que simplemente con un editor de texto se puede configurar GNU/Linux, a partir de estos archivos (configuraciones globales) y otros similares en el directorio de cada usuario (configuraciones personales). Esta estructura impide que la corrupción de uno de estos ficheros afecte a la configuración global del sistema. Las herramientas gráficas de configuración no hacen más que facilitar la edición de estos ficheros, presentando un interfaz agradable y textos de ayuda. Cuanta mayor familiaridad con estos ficheros se tenga, más fácil es cambiar de distribución sin sentirse desasistido por el cambio de utilidades de administración.

Los dispositivos en /dev

Los siguientes ficheros son inquilinos habituales de /dev, aunque pueden estar ausentes de tu sistema si no tienes el dispositivo correspondiente o si por algún motivo no se ha creado su representación como nodo en el sistema de ficheros:

  • /dev/fd[número] son los controladores de las disqueteras. Por ejemplo, fd0 es la primera disquetera, fd1 la segunda, etc.
  • /dev/fd[número] son los controladores de las disqueteras. Por ejemplo, fd0 es la primera disquetera, fd1 la segunda, etc.
  • /dev/ttyS[número] se usa para acceder a los puertos serie.Ejemplo: /dev/ttyS0 es el COM1de DOS.
  • /dev/hd[letra] representa un disco duro.

Ejemplo:
/dev/hda hace referencia a la totalidad del primer disco duro.
/dev/hda1 hace referencia a la primera partición de /dev/hda .

  • /dev/sd[número] hace referencia a los dispositivos SCSI. Ejemplo: Si posee discos duros SCSI, para acceder al primero deberá hacerlo mediante /dev/sda y no a través de dev/hda. A las cintas SCSI se accede con /dev/st[número] y a los CD-ROM con /dev/sr[número].
  • /dev/lp[número] se usan para los puertos paralelos. Ejemplo: Para el puerto LPT1 de DOS, se emplea /dev/lp0.
  • /dev/tty[número] son las consolas virtuales que hemos estudiado.
  • /dev/pty[número] son los pseudo-terminales. Se usan para proporcionar un terminal a una sesión remota. Ejemplo: las sesiones remotas a través de telnet usarán estos dispositivos.

/usr, /sbin y directorios

  • /usr: datos, programas y librerías accesibles por el usuario. Contiene la mayoría de los paquetes grandes de programas y sus ficheros de configuración.
  • /usr/X11: si se ha instalado el servidor X, estará aquí con todos sus ejecutables, ficheros de configuración y de soporte.
  • /usr/etc: contiene ficheros de configuración y programas del sistema. Los ficheros que se encuentran en /usr/etc/ no suelen ser esenciales para el sistema, a diferencia de los que se encuentran en /etc.
  • /usr/lib es el lugar de las librerías. Al compilar programa, este es enlazado con las librerías que se encuentran aquí. Estas dirigen al programa a buscar en /lib cuando llama al código de la librería.
  • /usr/bin es donde se encuentran la mayoría de los ejecutables de los programas.
  • /usr/local es la ruta donde se suelen instalar los programas específicos del sistema. Forma parte del sistema de paquetes saber dónde en la jerarquía /usr debe almacenarse un programa, pero cuando uno descarga un programa de internet y lo instala manualmente, o cuando es un programa escrito por uno mismo, lo habitual es hacerlo en esta ubicación (si se quiere que esté disponible para todos los usuarios).
  • /usr/share/man alberga las páginas de manual (man).
  • /usr/src es el ámbito donde manejar el código fuente de los programas. Uno de sus subdirectorios, /usr/src/linux, contiene el código fuente del núcleo.
  • /usr/sbin: Utilizado para herramientas de administración no esenciales (cron, lpd....).
  • /root es el directorio de la cuenta del administrador o root. Su espacio está separado del de los demás usuarios, que se encuentra dentro de /home, normalmente en una partición distinta.
  • /sbin: Comandos básicos para la administración del sistema (adduser, shutdown, init,...).

/var, /mnt y /proc

  • /var está dedicado a tareas del sistema que requieren un espacio variable: por ejemplo los registros de los servicios, las colas de impresión o de correo (es decir, lo que espera a ser atendido por la impresora o el sistema de correo), los almacenes de paquetes descargados de internet, etc.
  • /var/log contiene los registros históricos del sistema, con mensajes de advertencia, información extra, errores o problemas. Su análisis periódico es esencial para una correcta administración de la máquina.
  • /var/mail alberga los mensajes de correo locales. Habitualmente se tiene configurado el cliente de correo de modo que no se usa el sistema local, y por lo tanto los mensajes se guardan en algún subdirectorio del directorio de usuario.
  • /mnt es el punto de montaje temporal de dispositivos como la disquetera o el CD-ROM.
    /mnt/cdrom: punto de montaje del CDROM (en algunas otras distribuciones es simplemente /cdrom).
    /mnt/floppy: punto de montaje de la disquetera (en algunas otras distribuciones es /floppy).
  • /proc: es un sistema de ficheros virtual (los datos que contiene sólo existen mientras la máquina está encendida) que contiene información asociada con el núcleo que en ejecución. Se pueden conocer de los recursos utilizados por el sistema (CPU, memoria, swap, dispositivos...) consultando (cat /proc/pci, por ejemplo) los ficheros allí contenidos.

Permisos, grupos y usuarios

Un usuario es una persona autorizada a utilizar un sistema informático. El usuario se autentifica mediante un nombre de cuenta y su clave o password.

Internamente, el sistema operativo asigna a cada usuario (cuenta en el sistema) un identificador UID (User ID). Cada usuario tiene asociado unos derechos que definen las operaciones que le son permitidas.

Los usuarios se organizan en grupos. Todo usuario debe pertenecer a un grupo. Los derechos de un usuario son los suyos propios más los del grupo al que pertenece. El sistema operativo asigna un identificador GID (Group IDentifier) a cada grupo.

Para controlar el acceso al sistema de ficheros se usan 9 bits.

  • Si es un fichero de datos:
  • r: Indica que se puede leer.
  • w: Indica que se puede escribir.
  • x: Indica que se puede ejecutar.

Si es fichero de directorio:

  • r: Indica que se puede leer. Es decir se puede hacer un lspara ver su contenido.
  • w: Indica que se puede escribir. Es decir se pueden borrar o añadir ficheros de ese directorio y borrar el propio directorio.
  • x: Indica que se puede pasar a través de él (cambiar a) para encontrar un nombre de fichero.
  • Para cambiar el usuario o grupo al que pertenece un archivo se usa el comando chown. Por ejemplo, chown nombre_dueño:nombre_grupo nombre_archivo.
  • Para cambiar los permisos de un archivo (para el dueño, grupo u otros) se usa el comando chmod.

Procesos

Un proceso es un programa en ejecución. Una de las funciones del sistema operativo es gestionar los procesos en función de las peticiones del usuario.

El sistema operativo tiene información de las características de cada proceso y de los recursos que éste tiene asignados.

La vida de un proceso tiene las siguientes fases:

  • Creación: el sistema operativo crea un proceso cuando otro proceso solicita dicha creación.
  • Ejecución: Los procesos se pueden ejecutar de dos maneras: Batch: un proceso que se ejecuta en modo batch o por lotes toma los datos de entrada y produce la salida sin interacción con el usuario, normalmente leyendo y escribiendo ficheros en el disco (también puede hacerlo a streams o flujos de red).
    Interactiva: en este caso el proceso si está asociado con un terminal. Por ese terminal el proceso recibe información del usuario y entrega los resultados.
  • Muerte de un proceso: Un proceso puede dejar de ejecutarse (morir) por diferentes causas:
    Ha terminado su ejecución.
    Se produce un error durante la ejecución.
    El usuario u otro proceso decide acabar con su ejecución.

En función del número de tareas y del número de usuarios que pueden ejecutar simultáneamente, un sistema operativo puede ser:

  • Monotarea o monoproceso: sólo permite que exista un proceso en cada instante. Si quieres ejecutar varios procesos hay que proceder por orden, cada proceso esperando el testigo del anterior para poder iniciarse.
  • Multitarea o multiproceso: permite que existan varios procesos activos simultáneamente. En el caso de que no haya más de un procesador, el sistema operativo se encarga de repartir el tiempo del procesador ( time-sharingentre los distintos procesos. Por ejemplo, cuando un proceso hace principalmente entrada/salida leyendo de un disco, otro puede utilizar el procesador. Así todos los procesos van avanzando en su ejecución.

También se distingue entre SO monousuario y multiusuario en función del número de usuarios simultáneos que soportan.
El comando ps muestra la lista de todos los procesos activos en un determinado momento. Por ejemplo: ps -ef (-ef es una opción que muestra todos los procesos activos en formato largo). Otra combinación de opciones útil es -aux.

Para matar un proceso desde la línea de comandos se usa kill -s señal PID Donde "señal" es un número que indica que tipo de señal se le va a enviar al proceso (9 si queremos enviar la señal SIGKILL para matar al proceso, generalmente no es necesario), y PID es el identificador del proceso al que queremos enviar la señal (Process ID). El identificador de un proceso se puede obtener con ps.
Arranca desde una terminal en las X el programa xeyes ( xeyes &). Busca su número de proceso con ps y mátalo con kill. Puedes abreviar la llamada como kill -9 PID. Luego repite la maniobra con xkill.
Otro comando útil para matar procesos es killall nombre_de_proceso. Admite las mismas abreviaturas numéricas para las señales que kill, y la opción -ipara confirmar interactivamente la muerte de cada proceso.


Contacto