lunes, 31 de agosto de 2015

Permisos

Los sistemas operativos tradicionales de Unix difieren de los tradicionales de MS-DOS en que no sólo son sistemas multitarea, sino que también son sistemas multiusuario.

¿Qué significa esto exactamente? Significa que más de una persona puede estar usando el ordenador al mismo tiempo. Aunque un ordenador típico tenga sólo un teclado y un monitor, podrá ser usado  por más de un usuario. Por ejemplo, si un ordenador  está conectado a una red o a Internet, los usuarios remotos pueden  iniciar sesión a través de ssh (secure shell) y utilizar el ordenador. De hecho, los usuarios remotos pueden ejecutar aplicaciones gráficas y hacer que la salida gráfica aparezca en una pantalla remota. El Sistema X Window soporta esto como una parte de su diseño básico.

La capacidad multiusuario de Linux no es una "innovación" reciente, sino una característica que está profundamente integrada en el diseño del sistema operativo. Considerando el entorno en el que Unix fue creado, esto tiene mucho sentido. Hace años, antes de que los ordenadores fueran “personales”, eran grandes, caros, y centralizados. Un sistema informático típico de una universidad, por ejemplo, consistía en un gran ordenador central situado en un edificio y terminales localizados a lo largo del campus, cada uno conectado al gran ordenador central. El ordenador tenía que soportar muchos usuarios al mismo tiempo.

Para que esto fuese práctico, se debía idear un método para proteger a los usuarios entre sí. Después de todo, no se podía permitir que las acciones de un usuario bloquearan el ordenador, ni que un usuario pudiera interferir en los archivos que pertenecían a otro usuario.

En este capítulo vamos a ver esta parte esencial de la seguridad del sistema y presentaremos los siguientes comandos:
  • id – Muestra la identidad del usuario
  • chmod – Cambia el "modo" (los permisos) de un archivo
  • umask – Establece los permisos por defecto
  • su – Ejecuta un shell como otro usuario
  • sudo – Ejecuta un comando como otro usuario
  • chown – Cambia el propietario de un archivo
  • chgrp – Cambia el grupo propietario de un archivo
  • passwd – Cambia la contraseña de un usuario

miércoles, 26 de agosto de 2015

Resumiendo

En este capítulo hemos tratado algunos de los trucos de teclado que el shell ofrece para ayudar a los acérrimos mecanógrafos a reducir su carga de trabajo. Sospecho que según pase el tiempo y te familiarices más con la línea de comandos, volverás a este capítulo para recoger más de estos trucos. Por ahora, considéralos opcionales y potencialmente útiles.

lunes, 24 de agosto de 2015

script

Además de la función del historial de comandos en bash, la mayoría de las distribuciones Linux incluyen un programa llamado script que se puede utilizar para grabar una sesión de shell completa y almacenarla en un archivo. La sintaxis básica del comando es:

script [archivo]

donde archivo es el nombre del archivo utilizado para almacenar la grabación. Si no se especifica ningún archivo, se usa el archivo typescript. Mira la man page de script para ver una lista completa de las opciones y funciones del programa.

viernes, 21 de agosto de 2015

Expansión del historial

El shell ofrece un tipo especializado de expansión para elementos del historial usando el carácter “!”. Ya hemos visto cómo el signo de exclamación puede ir seguido por un número para insertar una entrada del historial. Hay otras aplicaciones de la expansión:

Tabla 8-6: Comandos de la expansión del historial
Secuencia Acción
!! Repite el último comando. Probablemente es más fácil pulsar la tecla de la flecha hacia arriba y luego enter.
!número Repite el elemento con ese número en la lista del historial.
!texto Repite el último elemento del historial que empiece con texto.
!?texto Repite el último elemento del historial que contenga texto.

Quisiera aconsejarte no usar las formas “!texto” y “!?texto!” a no ser que estés completamente seguro del contenido de los elementos del historial.

Hay muchos más elementos disponibles en el mecanismo de expansión del historial, pero es un asunto demasiado arcano y nuestras cabezas podrían explotar si continuamos. La sección HISTORY EXPANSION de la man page de bash ahonda en todos los detalles macabros. ¡Eres libre de explorarlo!

miércoles, 19 de agosto de 2015

Buscando en el Historial

En cualquier momento, podemos ver el contenido del historial así:

[me@linuxbox ~]$ history | less

Por defecto, bash almacena los últimos 500 comandos que has utilizado. Veremos cómo ajustar este valor en un capítulo posterior. Digamos que queremos encontrar los comandos que hemos usado para listar /usr/bin. Una de las formas en que podríamos hacerlo sería así:

[me@linuxbox ~]$ history | grep /usr/bin

Y digamos que entre los resultados tenemos una línea que contiene un comando interesante como este:

88 ls -l /usr/bin > ls-output.txt

El número “88” es el número de línea del comando en el historial. Podríamos usarlo inmediatamente mediante otro tipo de expansión llamada expansión del historial. Para utilizar la línea que hemos descubierto podríamos hacer esto:

[me@linuxbox ~]$ !88

bash expandirá “!88” en el contenido de la octogésimo octava línea del historial. Hay otras formas de expandir el historial que veremos un poco más tarde.

bash cuenta también con la capacidad de buscar en el historial incrementalmente. Esto significa que podemos decirle a bash que busque en el historial mientras vamos introduciendo caracteres, con cada carácter adicional más refinada será nuestra búsqueda. Para empezar una búsqueda incremental pulsamos Ctrl-r seguido del texto que estamos buscando. Cuando lo encuentras, puedes pulsar Enter para ejecutar el comando o pulsar Ctrl-j para copiar la línea del historial a la actual línea de la consola. Para buscar la siguiente coincidencia del texto (en el sentido “hacia arriba” en el historial), pulsamos Ctrl-r de nuevo. Para dejar de buscar, pulsamos Ctrl-g o Ctrl-c. Aquí lo vemos en acción:

[me@linuxbox ~]$

Primero pulsamos Ctrl-r:

(reverse-i-search)`':

El prompt cambia para indicar que estamos realizando una búsqueda incremental inversa. Es “inversa” porque estamos buscando desde “ahora” a algún momento en el pasado. A continuación, empezamos a escribir nuestro texto de búsqueda. En este ejemplo “/usr/bin”:

(reverse-i-search)`/usr/bin': ls -l /usr/bin > ls-output.txt

Inmediatamente, la búsqueda nos devuelve nuestro resultado. Con nuestro resultado podemos ejecutar el comando presionando Enter, o copiarlo a nuestra línea de comandos actual para editarlo presionando Ctrl-j. Vamos a copiarlo. Pulsamos Ctrl-j:

[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt

Nuestro prompt de shell vuelve y nuestra línea de comandos está cargada y ¡lista para la acción!

La siguiente tabla enumera algunas de las combinaciones de teclas usadas para manipular el historial:

Tabla 8-5: Comandos del historial
Tecla Acción
Ctrl-p Se mueve a la anterior entrada del historial. Misma acción que la flecha hacia arriba.
Ctrl-n Se mueve a la siguiente entrada del historial. Misma acción que la flecha hacia abajo.
Alt-< Se mueve al principio (arriba) del historial.
Alt-> Se mueve al final (abajo) del historial, es decir, la actual línea de comandos.
Ctrl-r Búsqueda incremental inversa. Busca incrementalmente desde la actual línea de  comandos hacia arriba en el historial.
Alt-p Búsqueda inversa, no incremental. Con esta combinación de teclas, escribes las palabras a buscar y presionas enter antes de que la búsqueda se realice.
Alt-n Búsqueda hacia adelante, no incremental.
Ctrl-o Ejecuta el elemento actual en el historial y avanza al siguiente. Esto es práctico si estás intentando reejecutar una secuencia de comandos del historial.

lunes, 17 de agosto de 2015

Usando el historial

Como descubrimos en el Capítulo 1, bash mantiene un historial de los comandos que hemos introducido. Esta lista de comandos se guarda en nuestro directorio home en un archivo llamado .bash_history. El historial es un recurso útil para reducir la cantidad de pulsaciones que tenemos que hacer, especialmente cuando lo combinamos con la edición en la línea de comandos.

viernes, 14 de agosto de 2015

Completado programable

Versiones recientes de bash tienen una característica llamada completado programable. El completado programable te permite (o mejor dicho, el proveedor de tu distribución te permite) añadir reglas de completado adicionales. Normalmente esto se hace para añadir soporte para aplicaciones específicas. Por ejemplo es posible añadir completados para la lista de opciones de un comando o para buscar tipos de archivo en concreto que soporte una aplicación. Ubuntu tiene una gran colección definida por defecto. El completado programable se implementa mediante funciones de shell, un tipo de mini scripts de shell que veremos en próximos capítulos. Si eres curioso, prueba:

set | less

y mira si puedes encontrarlos. No todas las distribuciones las incluyen por defecto.

miércoles, 12 de agosto de 2015

Completado

Otra forma en que el shell puede ayudarte es mediante un mecanismo llamado completado. El completado ocurre cuando presionas la tecla tabulador mientras escribes un comando. Veamos como funciona. Dado un directorio home que aparece así:

[me@linuxbox ~]$ ls
Desktop   ls-output.txt Pictures Templates Videos
Documents Music         Public

Prueba escribiendo lo siguiente pero no pulses la tecla Enter:

[me@linuxbox ~]$ ls l

Ahora pulsa la tecla tabulador:

[me@linuxbox ~]$ ls ls-output.txt

¿Ves cómo el shell completa la línea por tí? Probemos otra vez. De nuevo, no pulses Enter:

[me@linuxbox ~]$ ls D

Pulsa tab:

[me@linuxbox ~]$ ls D

No completa, sólo da un pitido. Esto ocurre porque “D” coincide con más de una entrada en el directorio. Para que el completado funcione, el “indicio” que le des no debe ser ambiguo. Si seguimos:

[me@linuxbox ~]$ ls Do

Y pulsamos tab:

[me@linuxbox ~]$ ls Documents

El completado funciona.

Aunque este ejemplo muestra el completado de nombres de archivo, que es su uso más común, el completado también funciona con variables (si el principio de la palabra es un “$”), nombres de usuario (si la palabra empieza con “~”), comandos (si la palabra es la primera en la línea.) y nombres de equipo (si la palabra empieza con “@”). El completado de nombres de equipo sólo funciona para los nombres de equipo listados en /etc/hosts.

Hay un número de secuencias de meta teclas y teclas de control que están asociadas al completado:

Tabla 8-4: Comandos de completado
Tecla Acción
Alt-? Muestra una lista de posibles completados. En la mayoría de los sistemas también puedes hacerlo pulsando la tecla tabulador una segunda vez, que es mucho más fácil.
Alt-* Introduce todos los completados posibles. Esto es útil cuando quieres usar más de una posible coincidencia.

Hay algunos más que me parecen bastante extraños. Puedes ver una lista en la man page de bash bajo “READLINE”.

lunes, 10 de agosto de 2015

La Meta tecla

Si te aventuras en la documentación Readline, que puedes encontrar en la sección READLINE de la man page de bash, encontrarás el término “meta key”. En los teclados modernos se asigna a la tecla Alt pero no siempre fue así.

Volviendo a los tiempos oscuros (antes de los Pcs pero después de Unix) no todo el mundo tenía su propio ordenador. Lo que podían tener era un dispositivo llamado terminal. Un terminal era un dispositivo de comunicación que contaba con una pantalla para mostrar texto y un teclado, y dentro  la suficiente electrónica para mostrar caracteres de texto y mover el cursor. Estaba conectado (normalmente con un cable serie) a una computadora mayor o a la red de comunicación de una computadora mayor. Había muchas marcas diferentes de terminales y todas tenían configuraciones de pantalla y teclado diferentes. Como todas tendían al menos a entender ASCII, los desarrolladores de software querían escribir aplicaciones portables reducidas al mínimo común denominador. Los sistemas Unix tienen una forma muy elaborada de tratar con los terminales y sus pantallas. Como los desarrolladores de Readline no podían estar seguros de la presencia de una tecla de control extra, se inventaron una y la llamaron “meta”. Igual que la tecla Alt sirve como tecla meta en los teclados modernos, puedes también pulsar y soltar la tecla Esc para tener el mismo efecto que pulsando la tecla Alt si todavía estás usando un terminal (¡Lo que aún puedes hacer en Linux!).

viernes, 7 de agosto de 2015

Cortar y pegar (Killing and Yanking) texto

La documentación Readline utiliza los términos killing (matar) y yanking (tirar) para referirse a lo que comúnmente denominamos cortar y pegar. Los elementos que se cortan son almacenados en un buffer llamado kill-ring.

Tabla 8-3: Comandos para cortar y pegar
Comando Acción
Ctrl-k Kill (corta) el texto desde la localización del cursor al final de la línea.
Ctrl-u Kill (corta) el texto desde la localización del cursor hasta el principio de la línea.
Alt-d Kill (corta) el texto desde la localización del cursor hasta el final de la palabra actual.
Alt-Retroceso Kill (corta) el texto desde la localización del cursor hasta el principio de la palabra actual. Si el cursor está al principio de una palabra, corta la palabra anterior.
Ctrl-y Yank (pega) texto del kill-ring y lo coloca en la localización del cursor

miércoles, 5 de agosto de 2015

Modificando el texto

La tabla 8 – 2 lista los comandos de teclado que se usan para editar caracteres en la línea de comandos.

Tabla 8 -2: Comandos de edición de texto
Comando Acción
Ctrl -d Borra un carácter en la localización del cursor
Ctrl -t Traspasa (intercambia) el carácter en la localización del cursor con el que le precede
Alt -t Traspasa la palabra en la localización del cursor con la que le precede
Alt -l Convierte los caracteres desde la localización del cursor hasta el final de la palabra a minúsculas
Alt -u Convierte los caracteres desde la localización del cursor hasta el final de la palabra a mayúsculas

lunes, 3 de agosto de 2015

Movimiento del cursor

La siguiente tabla lista las teclas usadas para mover el cursor:

Tabla 8-1: Comandos de movimiento del cursor
Teclas Acción
Ctrl-a Mueve el cursor al principio de la línea.
Ctrl-e Mueve el cursor al final de la línea.
Ctrl-f Mueve el cursor un carácter hacia delante; igual que la flecha derecha.
Ctrl-b Mueve el cursor un carácter hacia atrás; igual que la flecha izquierda.
Alt-f Mueve el cursor hacia delante una palabra.
Alt-b Mueve el cursor hacia atrás una palabra.
Ctrl-l Borra la pantalla y mueve el cursor a la esquina superior izquierda. El comando clear hace lo mismo.