#4sysadmins

Inicio » LPIC-1 Capítulo 4

LPIC-1 Capítulo 4

EN ESTE CAPÍTULO SE ABARCAN LOS SIGUIENTES OBJETIVOS DEL EXAMEN:

  • 103.3: Administración básica de archivos (4)
  • 104.4: Administrar cuotas de disco (1)
  • 104.5: Administrar los permisos y la propiedad de los archivos (3)
  • 104.6: Crear y cambiar enlaces de referencia y enlaces simbólicos (2)
  • 104.7: Localizar archivos del sistema y ubicar archivos en el sitio correcto (2)
  • 103.8: Edición básica con Vi (3)

 

Filesystem y Administrar archivos

Reglas de nomenclatura de archivos y expansión de comodines

Los nombres de archivos Linux pueden contener letras en mayúsculas o minúsculas, números e incluso, la mayoría de caracteres de control y puntuación. Para evitar confusiones recomendamos restringir caracteres no alfanuméricos como el punto (.), el guión (), el guión bajo (_), el asterisco (*), el signo de interrogación (?), la barra (/), la barra invertida (\) y las comillas ().
Algunos programas crean archivos de copias de seguridad que terminan en virgulilla (~), como editores de texto.
En la línea de comandos será necesario escapar los caracteres de espacio anteponiendo la barra invertida (\) o rodeando el nombre del archivo con comillas (nombre archivo).

Nota: Los nombres de archivos de DOS están restringidos a 8 caracteres para el nombre, seguidos de una extensión opcional de 3 caracteres, conocido esto como nombres 8.3. En Linux no es obligatorio el uso de extensiones pero es habitual ver extensiones de 1 hasta 4 caracteres, y sus nombres de archivos pueden empezar por punto “.nombre” (archivos ocultos)

En Linux existen dos nombres de archivos particularmente especiales. El archivo consistente en un solo punto (.) que hace referencia al directorio actual y el de dos puntos (..) que hace referencia al directorio principal o “padre” del directorio en el que nos encontramos.

Linux distingue minúsculas de mayúsculas en sus nombres de archivos (al contrario que Windows) por lo que entonces no es lo mismo File.txt que file.txt.

Comodines o Wildcards: Es un símbolo o conjunto de símbolo que representan a otros caracteres. Hay tres clases de comodines habituales en Linux:

  • ? : Representa un solo caracter. En expresiones regulares puede representar la opcionalidad de existencia de un caracter.
  • * : Coincide con cualquier caracter o conjunto de caracteres, incluyendo la ausencia de caracteres.
  • [] : Caracteres incluidos entre los corchetes representan la opcionalidad de existencia de uno de ellos en una cadena. Si por el contrario se separan dos caracteres por un guión (-), especificará que se trata de un rango de valores. Por ejemplo: Bo[a-z]t podrá hacer referencia a Boat, Boot, Bolt, etc..
Nota: El proceso de expansión de comodines se conoce como file gobbing o globbing

 

Comandos de archivos

Si queremos ver el contenido de un directorio mostrando así los nombres de los archivos, podemos usar el comando ls (list) con el que podemos usar diversas opciones entre ellas -F (–file-type) con el que podremos ver ademas del nombre, de que tipo de archivo se trata (* ejecutable,  / directorio, @ enlace simbólico, = socket o | para un pipe). No confundir esta opción del comando ls, con el propio comando file con el que además de conocer el tipo de archivo de una forma mas precisa, sabremos su también su formato.

Para copiar archivos usamos el comando cp, para mover archivos, directorios o simplemente cambiarles el nombre usamos mv. Tanto cp como mv comparten muchas de sus opciones. Una característica importante de mv es que cuando movemos un archivo de un directorio a otro dentro de un mismo sistema de archivo, mv actuará de una forma rápida ya que mv realizará la tarea reescribiendo las entradas del directorio, por lo que no habrá que leer y reescribir los datos del archivo, por el contrario si ambos directorios pertenecen a particiones o discos distintos, Linux debe de leer el archivo original, reescribirlo en la nueva ubicación y borrar el antiguo, lo cual ralentiza a mv.

Si queremos deshacernos de un archivo de forma permanente usaremos el comando rm. Linux no proporciona por defecto ningún tipo de funcionalidad de tipo “papelera” para su comando rm. Una vez eliminado un archivo con rm habrá desaparecido y no habrá forma de recuperarlo a menos que realice un mantenimiento de disco a bajo nivel con la utilidad debugfs.

Nota: Muchos administradores GUI de Linux si implementan una función de tipo papelera para que pueda recuperar fácilmente los archivos eliminados (a menos que haya vaciado la papelera).

Podemos modificar las marcas temporales de un archivo o crear uno vació en caso de que no exista con el comando touch. touch asigna la hora actual como hora de modificación y acceso .Los archivos nativos de Linux mantienen 3 marcas temporales para cada archivo:

  • Hora de última modificación
  • Hora de último cambio de nodo de índice
  • Hora de último acceso
Nota: Hay varios programas que se basan en estas marcas temporales, como por ejemplo la utilidad make que las utiliza para determinar qué archivos del código fuente se deben de recompilar si ya existe un archivo de objeto para un archivo particular.

 

Comandos para la compresión de archivos o paquetes de archivos

Existen diferentes utilidades para comprimir o descomprimir archivos individuales (tratamos también un paquete de archivo tar como un único archivo) que usan diferentes algoritmos de compresión, herramientas como zip, gzip, bzip2 o xz. Zip por ser antiguo y de los peores compresores de los citados no lo estudiaremos en el apartado de comando, basta decir que para comprimir un archivo con zip podemos hacerlo tal que así: $zip fichero.zip <archivo_a_comprimir>  y podremos descomprimirlo de la siguiente manera: $unzip fichero.zip

De las tres herramientas restantes gzip es la mas antigua y la que menor compresión ofrece, bzip2 ofrece mejor compresión y xz es la mas moderna y la que mejor compresión ofrece.
Gzip y bzip2 son dos buenas herramientas de compresión pero como es lógico dependiendo de que busquemos podremos utilizar una u otra. La compresión tanto con gzip como con bzip2 son muy buena, llegando incluso a reducir tamaños de binarios en un 40% – 50%. Ahora bien, si lo que buscamos es velocidad a la hora de comprimir/descomprimir deberíamos de usar gzip. Esto tiene un pero, y es que si usamos gzip a su mínima compresión será muy rápido pero a penas notaremos diferencia de compresión, mientras que si lo usamos a su máximo, será mas lento y comprimirá menos que si usamos bzip2 en su mínimo valor (ya estaría la cosa en ajustar el valor de gzip para que no fuese ni el mínimo ni el máximo y quizás consigamos una buena compresión en menos tiempo de lo que bzip2 podría hacerlo). Esto deja claro que bzip2 es mas lento que gzip pero que comprime mejor a cambio de un mayor uso de memoria.
Comprimir un archivo con gzip y bzip2:

$gzip <fichero>  y  $bzip2 <fichero>

Ambos comandos eliminan el archivo de origen.

Descomprimir un archivo gz y bz2:

$gzip -d fichero.gz   y  $bzip2 -d fichero.bz2
Nota: También podemos usar $gunzip fichero.gz para descomprimir archivos .gz y $bunzip fichero.bz2 para descomprimir archivos bz2

El funcionamiento básico de xz es parecido al resto de compresores. Por ejemplo si queremos comprimir o descomprimir un archivo bastará con pasarle como argumento el nombre del archivo; $xz archivo (para comprimir ‘archivo’ eliminándose el origen y dando como salida ‘archivo.xz’) y $unxz archivo.xz (para descomprimir ‘archivo.xz’ eliminándose este y quedando ‘archivo’ como resultado).
Con xz podemos tomar la salida de otros comandos como entrada de este, como por ejemplo: $tar baz.tar baz* | xz > baz.tar.xz
Podemos cambiar el formato de compresión a lzma usando su opción -F <formato> ($xz -F lzma archivo) y usar unlzma para descomprimir a este.
xz nos permite modificar la salida estándar con su opción -c tanto para comprimir como para descomprimir. xzcat y lzcat nos permitirán descomprimir archivos (.xz y .lzma respectivamente) redirigiendo su salida. Esto es útil si por ejemplo tenemos varios archivos de texto, algunos comprimidos con xz o lzma y otros no comprimidos, desplegando todo su contenido en un solo archivo.

$xz -dcf arch.txt compri.xz otro-texto.txt unlz.lzma > unidos.txt
Nota: La opción -f forzará la descompresión eliminando primeramente el archivo unidos.txt ya existente y creando este último. Además con esta opción podremos usar xz con enlaces simbólicos, archivos con varios enlaces de referencia (hard links), archivos con SUID, SGID o sticky bit

Tras la compresión o descompresión xz utilizará el propietario, grupo de propietario, los permisos, el tiempo de acceso y la hora de modificación del archivo fuente.

Nota: xz no admite aún la copia de otros metadatos como las listas de control de acceso o atributos extendidos.

El uso de la memoria para la compresión y descompresión variará en función de los parámetros utilizados, por ejemplo según que nivel de compresión utilicemos, se necesitará mas o menos memoria, siendo el nivel 6 el valor por defecto. Para descomprimir se usará de un 5% a 20% de la memoria que fue utilizada a la hora de comprimir el archivo. El uso de memoria y nivel de compresión podremos ajustarlo según las necesidades. En el apartado de comandos aprenderemos mas sobre xz.

 

Comandos de archivo de archivos: tar y cpio

Las herramientas de archivo de archivos recopilan un grupo de archivos en un único paquete (archivo). Linux incluye varios comandos de archivos siendo los mas destacados tar y cpio.

Nota: También se incluye dd que aunque no es técnicamente un comando de archivo nos permite copiar una partición o disco completo en un archivo o viceversa.

tar

La utilidad tar como comentábamos, nos permite agrupar varios archivos en un único paquete (tarball), que además podemos comprimir usando opciones de compresión. Según que opción pasemos, se usará una u otra herramienta para comprimir el paquete resultante: -z para compresión con gzip cuyo paquete tendrá la extensión .tar.gzip o tgz, -j para comprimir con bzip2 con extensión .tar.bz2 o .tbz y -J para compresión xz (extensión .tar.xz).

Nota: La compresión del paquete tarball reduce mas el tamaño total, que si hubiésemos comprimido uno por uno cada archivo del paquete y posteriormente haber creado un tar sin compresión. La desventaja de esto es que al comprimir un paquete tarball, este se vuelve mas susceptible ya que un error de un solo byte al inicio del archivo puede hacer que resulte imposible recuperar los datos.

Un ejemplo de agrupación y compresión con tar y su posterior descompresión y desempaquetado en un directorio diferente del que se encuentra el paquete tarball

$tar -cpvzf union.tar.gz *.txt
$tar -xpvzf union.tar.gz -C otrodir/
Nota: A la hora de descomprimir para luego desempaquetar podríamos usar también una herramienta de descompresión y pasar la salida por pipe como entrada de tar, tal que así:
$gunzip -c union.tgz | tar -xvf –

Recordatorio:

  • La opción -c indica que envíe su salida a la salida estándar indicada (en este caso a la pipe)
  • A tar no se le ha pasado el nombre del tarball, pero si, el guión (-), que asume que el nombre del archivo es el que se le pasa a la entrada de tar mediante la pipe que en este caso sería union.tar (ya que ha sido descomprimido por gunzip previamente)

Como siempre encontraremos mas información sobre los comandos en su respectivo apartado de comandos del tema en cuestión.

cpio

En principio la utilidad cpio es similar a tar pero los detalles de su funcionamiento difieren en algunos aspectos. cpio fue inicialmente creado para el almacenamiento de copias de seguridad en cintas magnéticas aunque su uso es el de copiar ficheros en o desde el árbol de directorio o archivo cpio.
Un archivo cpio (.cpio) consiste en una serie de ficheros y directorios, con los encabezados utilizados por GNU CPIO para extraer el archivo, y otros encabezados extras que contienen el nombre, fecha de creación, permisos y propietarios de cada archivo o directorio.
cpio tiene tres modos de operación: copy-out (-o, –create), copy-in (-i, –extract) y copy-pass (-p, –pass-trough)

Nota: Antes de explicar estos modos, aclararemos que tenemos que tener en cuenta que “dentro” será nuestra posición en el sistema de archivo, es decir, en el árbol de directorio, y “fuera” será el sitio que ocupa un archivo o directorio cuando se encuentra en el interior de un archivo .cpio.

Copy-out: Aclarado “fuera/dentro” en la nota anterior, entendemos que “copiar fuera” será copiar archivos/directorios desde el filesystem a un archivo .cpio (lo que llamaríamos en tar, empaquetar). Para llevar a cabo esto el comando cpio leerá una lista de nombres de archivos/directorios los cuales serán añadidos al archivo .cpio. Para pasar esta entrada es muy normal usar el comando find y redireccionar su salida mediante una pipe al comando cpio.

$find /home/user/desktop/ | cpio -o > /tmp/miescritorio.cpio
$find /home/user/desktop/ | cpio -o | gzip /tmp/miescritorio.cpio.gz

(comprimiremos el archivo .cpio resultante)

Nota: Esto copiará todos los directorios y ficheros que tenemos en nuestro Escritorio en el archivo /tmp/miescritorio.cpio. Podríamos pasar la opción -depth para minimizar los problemas con directorios/subdirectorios a los que no podremos acceder por ejemplo, por no tener permisos.

Copy-in: Sabiendo que hace Copy-out, podemos imaginar lo que hará esta opción, “extraerá” o mejor dicho copiará el contenido de un archivo .cpio en nuestro árbol de directorio. Podemos “extraer” solo determinados ficheros o todo su contenido (si no pasamos un patrón).

$cpio -i < /tmp/miescritorio.cpio (todo el contenido)
$cpio -i solo-este-archivo < /tmp/miescritorio.cpio

Copy-pass: Básicamente lo que hace esta opción es copiar un árbol de directorios en otro directorio, sin usar un archivo .cpio como origen o destino. Copy-pass combina las dos opciones anteriormente explicadas. Si por ejemplo queremos tener un respaldo de un árbol de directorio en otro dispositivo, sistema de archivo remoto o una partición montada en el equipo, Copy-pass puede ser una buena opción.

$find . -print | cpio -pvd /mnt/destino

Recordatorio:

  • Imprimiremos los nombres de archivos con -print
  • La opción -p indica que será una Copy-pass y -d creará los directorios en el destino para ir alojando los archivos respaldados.

Podemos crear backups de determinados sistemas de archivos o directorios en un dispositivo de destino:

$find /home /opt /usr -xdev | cpio -oF /dev/st0

Referencias:

http://manpages.ubuntu.com/manpages/oneiric/es/man1/cpio.1.html

http://osr507doc.sco.com/en/OSUserG/_Creating_a_cpio_backup.html

dd

La utilidad dd puede ser un buen modo de crear copias exactas de particiones completas (ya que incluye incluso todos los espacios vacíos), hacer una copia exacta de un disco extraible (incluido los discos ópticos), copiar un disco para el que Linux carece de controladores del sistema de archivos, crear varias instalaciones idénticas de Linux en varios ordenadores (siempre que estos tengan discos duros del mismo tamaño) o crear un archivo vacío de un tamaño particular que pueda manipular posteriormente dándole formato con mkfs.

Los dispositivos ópticos requieren procedimientos de copias de seguridad especiales. Una buena forma es crear un archivo tar o cpio en disco, después utilizar mkisofs para dar formato ISO-9660 o UDF y posteriormente grabar el archivo de imagen en el disco óptico. El resultado será un disco que podrá montar y que contendrá un archivo que podrá leer con tar o cpio.

Otra opción es crear un archivo del archivo y grabarlo en el disco óptico con cdrecord. Un disco de este tipo no se podrá montar, pero podría acceder directamente al archivo utilizando el archivo del dispositivo CD-ROM.

Algunos inconvenientes del comando dd:

  • Una partición de 5GB que contiene sólo 5MB de archivos, requerirá 5GB de espacio de almacenamiento. Esto es debido a que dd copia los espacios en blanco
  • Para restaurar archivos individuales, a menos que sea un dispositivo de acceso aleatorio que se pueda montar, deberá restaurarlo todo para recuperar un único archivo
  • No resulta fácil restaurar la información en una partición que es mas pequeña que la original y en caso de ser una partición mayor, desperdiciará parte del espacio disponible

En el siguiente ejemplo, se realiza la copia de la partición 3 del dispositivo sda, en un dispositivo extraible (sdb).

$dd if=/dev/sda3 of=/dev/sdb1
Nota: Para restaurar la copia bastará con invertir el nombre de if  (InputFile) y of (OutputFile). Podemos usar el tamaño completo de sdb si no especificamos partición.

 

 

Los enlaces

Un enlace es un medio de proporcionar varias identidades a un comando, archivo o directorio (similar a un acceso directo de Windows) facilitándoles la accesibilidad, por ejemplo, permitir a los programas, buscar los mismos archivos en distintas ubicaciones o, referenciar a un ejecutable que se encuentra “escondido” tras una larga ruta, desde un enlace creado en el directorio en el que trabajamos.

Hay dos tipos de enlaces en Linux: Enlace de referencia (hard links) o enlaces simbólicos (soft links).

Los enlaces de referencia normalmente no se pueden crear a directorios, solo root puede intentarlo si pasa como argumento las opciones -d, -F o –directory. En la práctica es improbable que esto funcione, ya que la mayoría de los filesystem no lo soportan, en cambio, esto no supone ningún problema para los enlaces simbólicos.
Los enlaces de referencias creados por defecto con ln (sin opciones) produce dos entradas de directorio que apuntan al mismo archivo (mas concretamente, al mismo nodo de índice). Ninguno de los dos nombres es mas auténtico que otro por lo que para borrar el archivo, deberemos de eliminar ambos enlaces de referencia. Otra restricción de los enlaces de referencia es que deben referenciar a archivos dentro del mismo sistema de archivos a bajo nivel, por ejemplo, no podríamos crear un enlace duro o de referencia (hard link) desde / (raíz) hacia /home, suponiendo que /home esté en una partición independiente.

Por el contrario, los enlaces simbólicos son un tipo especial de archivo (archivos que contienen nombres de archivos) cuyo contenido apunta al archivo enlazado. Linux accede al archivo enlazado (archivo original) cada vez que intenta acceder al enlace simbólico, por lo que acceder a un enlace simbólico es como acceder al archivo original. Esto nos permite crear punteros entre sistemas de archivos de bajo nivel.

En la teoría acceder al archivo original desde el enlace simbólico consume una cantidad mínima de tiempo, por lo que es más lento acceder a los enlaces simbólicos que a los enlaces de referencia, aunque no lo suficiente como para percatarnos de ello.

En la práctica, los enlaces simbólicos son más comunes que los de referencia; sus desventajas son menores y la capacidad de enlazar entre sistemas de archivos independientes y directorios puede ser importante.

Nota: Cada enlace simbólico consume un único ínodo de índice.

La sintaxis para crear un enlace simbólico es básica:

$ln [opciones] <archivo-origen> <nombre-enlace>

 

Propiedad, Permisos y Comandos de directorios

La mayoría de comandos que se aplican a archivos, sirven para directorios: ls, mv, cp, rm, touch…

Para crear un directorio usamos el comando mkdir (make directory) y para eliminarlo rmdir (remove directory). Aclarar que para eliminar un directorio que contiene archivos usaremos rm -r (recursive) ya que rmdir no elimina archivos, deberíamos de eliminar primero todos los archivos y luego usar rmdir -p para borrar también los subdirectorios.

Administrar los permisos y la propiedad de los archivos

Podemos saber quien es el propietario de un archivo con el comando $ls -l (list), que genera un listado largo, que incluye la información de propiedad y permisos.

$ls -l

lista ls

Usemos este listado para estudiar algunas de las propiedades. Por ejemplo el primer dígito hace referencia al tipo de archivo ( : archivo regular, d : directorio y  l : enlace), existen además otros tipos como: p para pipes, s para Socket (similar a pipe pero permite enlaces de red y comunicaciones bidireccionales), b para dispositivo de bloque (archivo que corresponde a un dispositivo de hardware que transfiere información en bloques de mas de un byte de forma bidireccional, como los discos duros, disquetes, CD-ROM, etc..) y c para dispositivos de caracteres, que se corresponden con un dispositivo de hardware, hacia y desde el que se transfieren los datos en unidades de un byte (por ejemplo dispositivos con puertos paralelos y RS-232 en serie).
Los siguientes 9 dígitos engloban a los permisos del usuario propietario del archivo (los 3 primeros dígitos), los permisos del grupo primario del usuario propietario del archivo (los 3 siguientes dígitos) y los últimos 3 dígitos para el resto de usuarios, llamado también permisos generales o globales.
Linux codifica esta información en formato binario (cada dígito o permiso individual se le suele denominar bit de permiso).

Nota: Cada grupo de 3 bits de permisos se expresa en base 8 por lo que se usan los dígitos del 0 al 7. Siendo el valor 4 para el bit de lectura (r), 2 para el bit de escritura (w), 1 para el bit de ejecución o acceso (x) y 0 para la ausencia de permiso que se representa con un guión (-).

Conociendo el formato de los bits de permisos podremos deducir la representación numérica de los permisos. Ahora cojamos la 2ª línea del listado para su estudio:

indi

Esta línea indica que el usuario propietario del archivo (nebul4ck) tiene permiso total sobre el archivo r (4), w (2) y x (1) que numéricamente sería 7, los usuarios pertenecientes al grupo primario de nebul4ck (tripas) tendrán acceso de lectura (4) y escritura (2) (suman un total de 6) y el resto de usuarios solo de lectura (4) por lo que la representación numérica definitiva sobre el archivo abcd.txt sería de 764

Volviendo a la imagen del listado del directorio vemos que la primera línea del listado muestra la existencia de un directorio (d) y un enlace simbólico (l), hay que resaltar dos cosas sobre esto: la primera es que nunca (o no sería normal) veremos un directorio en el que el bit de ejecución o acceso no se defina junto al de lectura, ¿Por que? porque si tiene el bit de acceso es para que el usuario acceda al directorio y pueda listar su contenido (necesario el permiso de lectura ‘r’), de lo contrario para saltar a otro directorio dentro de este, deberá de conocer el nombre del siguiente directorio (ya que al no poder listar su contenido, desconocemos los directorios que pudiese haber dentro, algo “útil” si queremos esconder un subdirectorio dentro del directorio y que “solo” nosotros podamos acceder conociendo el nombre de este). La segunda nota a resaltar es que cuando creamos un enlace simbólico este se crea con permisos 777 (rwxrwxrwx) para que todos los usuarios puedan leer el contenido del enlace para saber el nombre del archivo al que apunta, pero los permisos del archivo enlazado son los que determinarán finalmente el acceso a este.

Nota: El cambio de los permisos del enlace simbólico afectará al archivo enlazado, pero el enlace seguirá con permisos 777

Si un usuario puede escribir en un directorio (el directorio tiene permiso w), dicho usuario podrá crear, borrar o renombrar los archivos del directorio, incluso si el usuario no es el propietario de dichos archivos y además no tiene permisos de escritura sobre estos. Es el permiso w del directorio el que tiene preferencia sobre su contenido y no los permisos individuales de los que cuelgan de este.

Nota: El superusuario puede leer o escribir en cualquier archivo del ordenador, incluso en aquellos que tienen permisos 000

Bits de permisos especiales y ACL

Existen opciones adicionales para los permisos, que se pueden indicar mediante cambios en la cadena de permisos:

  • Definir el ID de usuario (set user ID, SUID): Se utiliza en archivos ejecutables indicándole a Linux que ejecute el programa con permisos del propietario del archivo y no con los permisos del usuario que en realidad ejecuta el programa. El permiso SUID está indicado por una “s” en la posición del bit de ejecución del propietario del archivo (rwsr-xr-x).
  • Definir el ID de grupo (set group ID, SGID): Similar a la opción SUID, pero asigna el bit “s” en la posición del bit de ejecución del grupo propietario del programa. (rwxr-s-r-x). Cuando se define el bit SGID en un directorio, los nuevos archivos o directorios creados bajo este heredarán el grupo propietario del directorio y no el grupo principal del usuario que ha creado realmente el archivo.
  • Definir el Sticky bit: En las versiones mas modernas de Unix se utiliza el Sticky bit para evitar que los archivos que se encuentran dentro de un directorio con permisos de escritura (w) puedan ser borrados por usuarios que no son su propietario. Cuando este bit está presente en un directorio, solo podrán eliminar los archivos del directorio los propietarios de estos, el propietario del directorio o root. El Scticky bit se indica con una “t” en la posición del bit de ejecución de los permisos generales (rwxr-xr-t). Si aplicamos sticky bit sobre archivos ejecutables, provocará que estos programas permanezcan en el área swap lo cual resulta en programas que cargan mas rápido.

Advertencia: Los programas con SUID y SGID (y en particular los programas root SUID) suponen riesgos potenciales para la seguridad ya que al ser ejecutados por un usuario normal, este tomará privilegios de root (o del usuario propietario del programa) durante la ejecución de ese programa. Si el programa ejercer tareas de eliminación de archivos críticos o acceso a sitios donde solo root podría acceder, dicho usuario no tendrá problemas a la hora de realizar estas tareas. Es decir el usuario conseguirá una elevación de privilegios.

Nota: Cuando estudiemos a continuación los comandos para el cambio de propietario, grupo y modos de un archivo o directorio, veremos como se asignan los bits SUID, SGID y Sticky bit, pero de momento decir que el bit SUID es asignado por un 4, el SGID por un 2 y el Sticky bit por un 1.

ACL

Una Lista de Control de Acceso es una lista de usuario o grupo y los permisos que tienen asignados sobre determinados archivos o directorios. Una ACL consta de 3 bits al igual que los permisos ordinarios (r, w y x), pero difiere en que no está limitada, bien a un grupo propietario (en el que deberíamos de añadir a todos los usuarios que quisiéramos distinguir del resto de usuarios) o a permisos generales (es decir a todos los usuarios) si no que nos permite que el propietario del archivo pueda asignar diferentes permisos a diferentes grupos o usuarios.

Nota: Para crear una ACL el sistema de archivo debe de tener soporte para esta. Actualmente los principales sistemas de archivos de Linux soportan ACL, pero puede que tenga que recompilar su kernel (o, al menos, el módulo pertinente del kernel) para activar dicha compatibilidad.

Para definir o visualizar ACL estás cuentan con sus propios comandos. Con setfacl podremos definir una ACL y con el comando getfacl podremos mostrar la ACL de un archivo.

Importante crear una ACL por defecto, así cada vez que creemos contenido dentro de un directorio en el que hemos definido la ACL heredará los permisos de este. En el apartado de comandos, tratamos el parámetro adecuado para tal fin.

 

Cambiar el propietario, grupo, modos y atributos de los archivos

El superusuario puede cambiar el propietario de un archivo o directorio mediante el comando chown.

La sintaxis del comando chown es:

$sudo chown [opciones] nuevpropietario:nuevogrupo <archivos a modificar>
Nota: El comando chown acepta el punto (.) como separador de nuevousuario y nuevogrupo, no obstante el uso del punto es obsoleto por lo que esta característica podrá acabar desapareciendo.

Para cambiar el grupo propietario de un archivo se usa chgrp, el cual acepta mucha de las opciones del comando chown. Al igual que chown solo root podrá cambiar el grupo propietario de un archivo, aunque para chgrp existe una excepción y es que un usuario normal podrá cambiar el grupo principal de un archivo de su propiedad siempre y cuando el usuario pertenezca al nuevo grupo.

Los permisos de los archivos o directorios los pueden cambiar el superusuario y el propietario del archivo, se cambian con el comando chmod y su sintaxis es:

$sudo chmod [opciones] modo <nombre archivo>

Las opciones de chmod son similares a las de chown y por tanto a las de chgrp.
Podemos especificar el modo de un archivo de dos formas básicas: como un número octal o como un modo simbólico.

  • Modo octal: $sudo chmod 644 archivo.txt
Nota: Si no usamos 4 dígitos, chmod limpiará los bits SUID, SGID y Sticky Bit. Esto en ocasiones no funciona por lo que deberemos de limpiar los dígitos de forma simbólica: chmod u-s archivo.txt

Modo octal indicando el bit SGID: $sudo chmod 2644 archivo.txt
Modo octal indicando el Sticky bit: $sudo chmod 1644 archivo.txt
Modo octal indicando los bits SUID, SGID y Sticky bit: $chmod 7644 archivo.txt

  • Un modo simbólico consta de tres componentes:
  1. Código que indica el conjunto de permisos que desea modificar: propietario (u), el grupo (g), globales (o) o todos (a)
  2. Símbolo que indica la acción a realizar; añadir (+), quitar() o definir el valor indicado (=)
  3. Por último, el código que especifica cuál debería ser el permiso: rw, rwx, rx, etc…
Nota: Estos códigos diferencian entre mayúsculas y minúsculas

Ejemplo 1: Dar permisos rw al propietario, r al grupo y quitar w al grupo:

$sudo chmod u+rw,g+r,g-w report.txt
Nota: Si el grupo anteriormente ya tenía permisos de escritura y el resto de usuarios por ejemplo permisos de lectura, este comando no anulará lo que ya había. Para especificar el valor concreto, anulando posibles permisos dado anteriormente usamos (=)

Ejemplo 2: Dar permisos concretos (anula lo que ya había):

 $sudo chmod u=rwx,g=rx,o=r archivo.txt

Al igual que otorgamos permisos de forma simbólica para r,w y x, podemos hacerlo para SUID y SGID (s), y Sticky bit (t). Además existe la opción X que permite ejecutar solamente si el archivo es un directorio o si el archivo tiene permisos de ejecución.

Por lo general usamos modos simbólicos para dar permisos sencillos, como u+x (para que el usuario tenga permisos de ejecución tras crear un script) y modo octal para dar permisos mas específicos como rw-r-xr–

Importante: Debemos de saber que los permisos de archivos se almacenan como parte del nodo de índice del archivo, que no forma parte de la entrada del directorio. El acceso de lectura y escritura a la entrada del directorio o, incluso, al propio archivo, no le da al usuario el derecho de cambiar las estructuras de nodos de indice (a menos que lo haga de un modo indirecto, como por ejemplo, cuando al escribir se cambia el tamaño del archivo o cuando un borrado de archivo elimina la necesidad del nodo de índice).

Umask y el grupo por defecto

Podemos definir el modo y el grupo de un archivo por defecto. Cuando un usuario crea un archivo, dicho archivo tiene un propietario predeterminado (por defecto su creador y el grupo principal de este) y unos permisos predeterminados que vienen definidos por la máscara del usuario. Esta máscara se puede modificar con el comando umask (umask es una operación a nivel de bits).

El comando umask recibe como entrada un valor octal que representa los bits a eliminar de los permisos 777 de los directorios, o 666 de los permisos de archivos.
Pongamos un ejemplo: Supongamos que tenemos una umask de 022 o 002 (suelen ser las umask por defecto), si creamos un directorio este se creará con los permisos 755 o 775 (777 – 022 y 777- 002), si creamos un archivo los permisos serán 644 y 664.

Nota: Si tenemos una umask de 247, los permisos de los nuevos directorios serán 530 y 420 para archivos, como vemos no importa que se reste 7 al valor máximo de un archivo que es 6, pues en este caso umask no afecta al bit de ejecución (que es el que eleva a 7 la suma total y que por defecto no viene en los archivos). Esto es porque como dijimos, umask es una operación a nivel de bits, por lo que si un bit no está definido (como es el caso del bit de ejecución en ficheros) no habrá donde operar.

Los usuarios normales pueden introducir el comando umask para cambiar los permisos de los nuevos archivos que creen. El superusuario también puede cambiar la configuración por defecto para todos los usuarios, modificando un archivo de configuración del sistema (/etc/profile).

Advertencia: La configuración de umask en el archivo /etc/profile puede ser invalidada por los archivos de configuración de perfil de inicio de cada usuario (~/bash_profile).

Podemos ver la configuración de umask en octal con el comando umask y de forma simbólica con umask -S. Al igual que los modos de los archivos, podemos definir la umask por defecto de forma simbólica, pero de hacerlo así deberemos de indicar los bits que si queremos definir, por ejemplo,

$umask u=rw,g=rx,o=rx (644)

Además de la máscara, los usuarios pueden cambiar su grupo predeterminado para nuevos archivos con el comando newgrp. Para tal cambio el usuario deberá de pertenecer a dicho grupo. Para reinicializar el entorno y hacer que los cambios tengan efectos usamos newgrp -l

Por último decir que algunos sistemas de archivos nativos de Linux admiten varios atributos que se pueden ajustar con el comando chattr, veremos de que atributos se trata en el apartados de comandos de este mismo capítulo.

 

Administrar las cuotas de disco

Las cuotas de disco son límites que implementa el SO para controlar el número de archivos o la cantidad de espacio en disco que puede consumir un único usuario. El sistema de cuotas de Linux admite cuotas tanto para usuarios individuales como para grupos. Estas cuotas son independientes unas de las otras, esto quiere decir que el total de cuota en disco de los usuarios de un grupo no está relacionado con la cuota aplicada al grupo. Por ejemplo, imaginemos que tenemos 5 usuarios con una cuota en disco individual de 500MB cada uno, y todos son miembros del grupo ‘sistemas‘,  el total de cuota en disco de los usuarios sería de 2,5GB, pero no por ello la cuota de disco del grupo ‘sistemas‘ tiene que tener tal tamaño, puede que tan solo tenga 1GB. Cuando un usuario crea un archivo, el archivo tendrá como propietario a ese usuario y su grupo principal que puede que no sea el grupo ‘sistemas‘ por lo que ese archivo consumirá espacio de la cuota del usuario (2,5GB) pero no de la del grupo ‘sistemas‘. En cambio si la cuota de disco del grupo ‘sistemas‘ se llena y un usuario tiene como grupo principal a ‘sistemas‘ este usuario tendrá que cambiar de grupo para poder crear archivos ya que la cuota de disco del grupo ‘sistemas‘ al estar llena le impedirá crear nuevos archivos.

Importante: Cuando un usuario crea un archivo nuevo, primero se revisa la cuota de disco del grupo propietario del usuario, si esta está llena el usuario no podrá crear archivos, aunque su cuota de disco individual este vacía. Además una vez creado el archivo el tamaño de este será sumado a la cuota de grupo y no a la de usuario. Por ello es aconsejable que se creen cuotas para usuarios individuales y grupos no principales para ninguno de los usuarios.

Las cuotas requieren soporte tanto en el kernel como en varias utilidades del espacio de usuario. Los sistemas de archivos ext2, ext3, Reiserfs, JFS y XFS admiten cuotas de disco.
Para el uso de cuotas debemos activar explícitamente el soporte mediante la opción “Quota Support” del Kernel en el área del sistema de archivos, cuando recompilemos el kernel aunque muchas distribuciones vienen con este soporte precompilado.
Hay dos sistemas de soporte para cuotas disponibles: v1 (kernel 2.4.x) y v2 (serie de kernels 2.6.x +). Ambas funcionan de modo similar.
Se necesitarán herramientas de soporte para emplear cuotas. Para cuota v2 el paquete se suele denominar “quota” e instala varias utilidades, archivos de configuración, scripts de inicio del sistema,etc..
Deberemos de modificar las entradas de /etc/fstab para cualquier partición con la que vayamos a usar cuotas, en particular añadir la opción de montaje del sistema de archivos usrquota (para cuotas de usuario) y grpquota (para las cuotas de grupo), tal que así:

/dev/sda5 /home ext3 usrquota,grpquota 1 1

Por regla general los pasos necesarios a dar son: cargar el módulo del kernel para el uso de cuotas con modprobe, si fuera necesario ejecutar el script de inicio (que usa el comando quotaon para activar el soporte de cuotas) y re-montar los sistemas de archivos implicados en el uso de cuota (una vez definido como comentamos anteriormente en /etc/fstab) con el comando mount -o remount /sistema/de/archivo.

Nota: Si hemos tenido que recompilar el kernel para añadir directamente el soporte para cuotas, una vez definido en fstab el uso de cuotas, y habiéndonos asegurados que los script de inicio se van a encargar de ejecutar el soporte con quotaon, deberemos entonces de reiniciar.

LLegados a este punto el soporte para cuotas debería de estar totalmente activo, ahora llega el momento de establecer las cuotas de disco para los usuarios o grupos.

El comando edquota <usuario> inicia el editor Vi con un archivo de configuración temporal (/etc/quotatab, que proporciona información sobre el número de bloques de disco y de nodos de índice en uso) que controla las cuotas para el usuario especificado (podemos usar la opción -g <grupo> para indicar un grupo). Al finalizar, edquota utilizará este archivo de configuración temporal para escribir la información de cuota en las estructuras de datos de disco de bajo nivel.

Existen límites de cuota estrictos (hard) y límites flexibles (soft).

  • Los límites estrictos son el número máximo de bloques o nodos de índice que puede consumir el usuario. El kernel no permitirá a un usuario sobrepasar estos límites.
  • Los límites flexibles son en cierto modo menos restrictivos; los usuarios pueden exceder temporalmente sus valores, pero en tal caso el sistema emitirá un aviso. Estos límites trabajan con un “periodo de gracia”, si su límite de cuota se excede durante un tiempo mayor al establecido, el kernel comenzará a tratarlos como límites estrictos y no permitirá al usuario crear mas archivos. Podemos definir este “periodo de gracia” con el comando edquota y su opción -t.
Nota: Los periodos de gracia se definen para todo el sistema de archivos.

Podemos anular un límite de cuota indicando un valor de 0 y además ajustar los límites de cuota de forma independiente para cada sistema de archivo.

El comando quotacheck verifica y actualiza la información de las cuotas en los discos con cuotas activadas, además de asegurar que la contabilidad de las cuotas sea la adecuada.

El comando repquota resume la información de las cuotas del sistema de archivos especificado o de todos los sistemas de archivos si le pasa la opción -a. Esta herramienta puede ser muy útil para seguirle la pista de uso del disco a un usuario o filesystem.

El comando quota posee un efecto similar. quota -g muestra las cuotas del grupo, con -l omite los montajes NFS y -q limita la salida a los sistemas de archivos cuyo uso sobrepasa el límite.

 

Aprender a localizar archivos y las herramientas útiles

Linux proporciona varias herramientas para ayudarnos a localizar archivos, pero antes de usarla es recomendable conocer como está estructurado el árbol de directorios de un sistema Linux y que podemos encontrar en cada uno de ellos, esto nos facilitará o nos permitirá hacer búsquedas mas concisas.

Con la implantación de FSSTND (Filesystem Standar, Estándar de Sistema de Archivos) se estandarizó varias funciones específicas que debía de cumplir la jerarquía del árbol de directorios Linux

  • Estandariźo los programas que se encontraban en /bin y /usr/bin
  • Especificó que los archivos ejecutables no debían de estar en /etc
  • Eliminó los archivos cambiables del árbol de directorios /usr, permitiendo así que este se montara en modo de sólo lectura (una útil medida de seguridad)

Existen tres versiones principales de FSSTND: 1.0, 1.1 y 1.2, no obstante hacia 1995, las limitaciones de FSSTND se hicieron evidentes, por lo que se desarrollo un nuevo estándar: FHS (File Hierarchy Standar, Estándar de Jerarquía de Sistema de Archivo), basado en FSSTND, pero que lo amplia sustancialmente.

FHS hace una importante distinción entre archivos compartibles y no compartibles, y archivos estáticos y dinámicos. La mayoría de los programas ejecutables son claro ejemplo de archivos estáticos mientras que los directorios y las colas de correo están compuestos por archivos variables.
FHS intenta aislar cada directorio en una celda de esta matriz de 2×2 (compartible/no compartible x estático/variable)

matriz

Nota: Algunos directorios son mixtos pero en estos casos, FHS intenta especificar el estado de los subdirectosios concretos, por ejemplo, /var es variable y contiene algunos subdirectorios compartibles y otros no compartibles.

Algunos distribuidores de Linux, en especial Fedora, iniciaron cambios que se alejan de FHS, como por ejemplo, desde Fedora 17, todos los binarios se incluyen en /usr/bin y /usr/sbin, siendo ahora los directorios /bin y /sbin enlaces simbólicos. Este sistema complica algunos tipos de configuraciones como las que requieren una partición /usr independiente.

Los directorios mas comunes definidos por FHS o utilizados por convención son:

  • / : Directorio raíz. El resto de directorios cuelgan de este. Algunos directorios como /etc o /sbin deben de residir en la misma partición de raíz.
  • /etc : Archivos de configuración y scripts de shell como por ejemplo los de inicio SysV
  • /etc/skel : Contiene los archivos de configuración estándar para ser copiados a los directorios home cuando una nueva cuenta de usuario es creada.
  • /etc/X11 : Archivos de configuración de X Window
  • /Lost+found : Directorio usado para los archivos recuperados.
  • /boot : Contiene archivos estáticos y no compartibles relacionados con el arranque del ordenador. Algunos sistemas imponen límites a /boot, por ejemplo, las antiguas BIOS x86 y versiones antiguas de LILO pueden necesitar que /boot se encuentre por debajo del cilindro 1024 del disco. Algunos métodos de arranque EFI, funcionan mejor con /boot como partición independiente bajo ext2fs o Reiserfs
  • /bin : Contiene los comandos que son accesible por todos los usuarios. En sistemas como Fedora, suele ser un enlace simbólico a /usr/bin.
  • /sbin : Contiene programas que por regla general solo son ejecutados por root (herramientas de gran impacto como por ejemplo e2fsck y fdisk)
  • /lib : Contiene las bibliotecas de los programas, y bajo /lib/module se encuentran los módulos del kernel
Nota: /bin, /sbin y /lib, contienen archivos estáticos y pueden ser compartidos, aunque en la práctica esto no suele tener mucho sentido.
  • /usr : Aloja la mayoría de los programas Linux. Su contenido es estático y compartible y como medida de seguridad puede ser montado como solo lectura. Muchos administradores separan /usr en una partición independiente. Algunos directorios que cuelgan de /usr como bin y lib, aun siendo importantes, no lo son lo suficiente como para impedir el funcionamiento de un ordenador.
  • /usr/local : La idea de este directorio es tener un área que esté a salvo durante las actualizaciones automáticas del software, por lo que puede ser un buen sitio para alojar archivos que instala localmente el administrador de sistemas, de echo muchos suelen crearle su propia partición para mantener a salvo estos archivos/programas en futuras actualizaciones del sistema o migración de OS.
  • /usr/local/bin : Archivos binarios de software instalados después de la instalación del sistema operativo.
  • /usr/X11 : Hace tiempo este directorio se utilizaba frecuentemente para albergar los archivos relacionados con el sistema de ventanas X, pero las nuevas distribuciones han movido el contenido de este a otros directorios como /usr/bin
  • /usr/bin : Aquí residen la mayoría de las aplicaciones del usuario. Debe de formar parte del valor de la variable PATH de los usuarios.
  • /usr/sbin : Binarios no esenciales y ejecutados por root.
  • /usr/include : Los archivos headers estándares de C/C++
  • /usr/lib : Librerías estáticas, así como los subdirectorios para las librerías de lenguaje no C/C++
  • /usr/src : Archivos fuentes de la mayoría de los paquetes instalados en el sistema
  • /usr/src/linux : El código fuente de Linux
  • /opt : Este directorio es similar a /usr/local solo que suele almacenar archivos y programas desarrollado por terceros, como procesadores de textos, juegos, etc… Por ello muchos administradores creen conveniente crear una partición independiente de manera que su contenido pueda ser respaldado, migrado y compartido.
  • /home : Directorio compartible y variable que contiene los datos de los usuarios. Aunque para el estándar FHS se considera opcional, realmente lo opcional es su nombre, por ejemplo al añadir un nuevo disco para crear un segundo home (/home2) para separar los home de unos usuarios y los de otros. Por esta razón suele estar en una partición independiente.
  • /root : Es el directorio home del superusuario
  • /var : Contiene archivos efímeros de varios tipos: registros del sistema (logs), cola de impresión, correo (spool), noticias, etc… Al igual que /home, /opt y en ocasiones /usr/local, /var suele estar en una partición independiente, en especial, en sistemas que registran gran actividad como servidores de impresión, de correos, sistemas que suelen generar una cantidad importante de log de servicios, etc…
  • /tmp : Aloja los archivos temporales. La mayoria de las distribuciones incluyen rutinas que limpian este directorio periódicamente (a veces al inicio del sistema). Colocar a /tmp en una partición independiente puede ser una buena idea, ya que puede ocurrir que procesos no controlados provoquen problemas en el sistema de archivos raíz al crear archivos temporales demasiado grandes.
  • /mnt : Ubicación tradicional para montar dispositivos extraibles, aunque está siendo reemplazado por el directorio /media, que es opcional en FHS.
  • /dev : Contiene un gran número de archivos que hacen de interfaz de hw. Como ya vimos es controlado por el kernel y herramientas de soporte (udev), que crean sobre la marcha los archivos de dispositivos conectados al sistema. Un usuario con privilegios suficientes podrá acceder (escribir/leer) al hardware directamente a través de estos archivos de dispositivo. Algunos archivos de dispositivos importantes son: /dev/hdX y /dev/sdX (para discos rígidos), /dev/fdX (para discos flexibles), /dev/md0 (primer grupo de meta-discos, dispositivo RAID), /dev/stX o /dev/nstX (para cintas magnéticas), /dev/loopX (para montar CD-ROM), /dev/lpX (puertos paralelos), /dev/null (dispositivo interpretado como un cubo donde almacenar bits que nunca mas se volverán a ver, es como un agujero negro donde poder, por ejemplo, enviar la salida de comandos que no queremos que sean mostradas),  /dev/psaux (puerto para el ratón PS/2, aunque existen otros como /dev/usb/usbmouse o /dev/input/mice), /dev/zero (dispositivo del que poder obtener ceros), /dev/ttySX (puertos serie).
  • /proc : Es un sistema de archivo virtual que Linux crea dinámicamente para proporcionar acceso a ciertos tipo de información del hardware: info de cpu, IRQ, direcciones de E/S, DMA, procesos, etc…
Nota: Colocar un programa en la ubicación equivocada puede provocar problemas a largo plazo, por ejemplo, si coloca un archivo binario en /bin cuando este debería de ir en /usr/local/bin, puede que dicho programa se sobreescriba o incluso se elimine al realizar una actualización del sistema.

La lista anterior de directorios esta incompleta, si quieres saber más (obligatorio para administradores de sistemas) puedes acceder a la página oficial de FHS http://www.pathname.com/fhs/ , aun así haz -> clic <-  aquí para ver un listado con los directorios/archivos mas importante o utilizados. Es un extracto del libro “Guía para administradores GNU/Linux v0.8” (Traducción en TLDP-ES, http://es.tldp.org/ )

Ahora que conocemos de alguna forma el árbol de directorios vamos a intentar localizar archivos de una forma mas precisa. Para encontrar los archivos del ordenador Linux emplea comandos como find, locate, whereis…

La utilidad find implementa un sistema de fuerza bruta para localizar archivos. Este programa localiza los archivos buscando por todo el árbol de directorios especificado, revisando los nombres de los archivos, sus fechas de creación, etc… find tiende a ser lento pero es mas flexible y tiene una mayor probabilidad de éxito que otros programas de búsqueda, si a esto le añadimos que sabemos en que directorios buscar determinados archivos, supondrá una optimización en el tiempo de búsqueda. La sintaxis de find es sencilla y admite multitud de opciones que veremos mas detalladamente en el apartado de comandos de este mismo tema.

Nota: El comando find no sobrepasa los permisos de archivos, por lo que si carecemos de permisos para mostrar el contenido de un directorio, find devolverá el nombre del directorio acompañado de un mensaje de error.

Otra herramienta de búsqueda es locate, que funciona de un modo muy similar a find en los casos en que queremos buscar un archivo por su nombre. La herramienta locate normalmente se utiliza para buscar sólo por el nombre del archivo (devuelve todos los archivos que contienen la cadena especificada). La utilidad locate trabaja con una base de datos que en muchas distribuciones suele ser actualizada mediante una tarea cron en la que se invoca al comando locate con opciones que hacen que esta se actualice. Para actualizar la base de datos de locate tambien podemos usar el comando updatedb en cualquier momento. Al trabajar con una base de datos, locate suele ser mucho mas rápido que el comando find en particular las búsquedas que realizamos por todo el sistema, pero hay que tener en cuenta que si no actualizamos ciertos directorios a la hora de actualizar la base de datos, locate omitirá estos directorios en su búsqueda. Para utilizar locate basta con escribir:

$locate cadena-busqueda

Importante: Algunas distribuciones de Linux utilizan slocate en lugar de locate. El programa slocate incluye características de seguridad que impiden que los usuarios vean los nombres de los archivos de los directorios a los que no tienen acceso. En la mayoría de los sistemas que utilizan slocate, el comando locate es un enlace a slocate, por lo que locate implementa las características de seguridad slocate. Algunas distribuciones, por defecto, no instalan locate ni slocate.

Si queremos localizar ejecutables de programas y archivos relacionados, como archivos de documentación o configuración, podremos usar la herramienta whereis.
El programa whereis devuelve los nombres de archivos que comienzan por aquello que escriba como criterio de búsqueda, inconluso en archivos con extensiones. Con frecuencia esta funcionalidad halla los archivos de configuración de /etc, páginas man y archivos similares. Podemos usar whereis de este modo:

$whereis ls

Si por el contrario lo que queremos es conocer la ruta a un determinado comando (por ejemplo para incluir esta en un shell script que estamos programando y que necesitamos para llamar a un programa) usamos which que devolverá la ruta completa de la primera coincidencia que encuentre (podemos mostrar todas las coincidencias con el parámetro -a)

Otro comando que aunque no sea una utilidad de búsqueda, nos puede venir bien si queremos saber como interpreta Linux un determinado comando (si es nativo, es un comando externo o alias, etc…) es la herramienta type.

 

Edición básica con Vi

Primer editor de texto a pantalla completa creado para UNIX, diseñado para ser pequeño y sencillo. Podemos abrir el editor Vi de diferentes formas:

1 . Abrir un archivo para editar con Vi en modo “full screen“:

$ vi /etc/fstab

2 . Recuperar la última versión guardada de un fichero. Esto es útil si no hemos cerrado correctamente Vi y se ha quedado guardado el archivo swap del fichero:

$ vi -r /home/nebul4ck/listas.txt

3 . Abrir un archivo con Vi situándonos en la última línea:

$ vi + /etc/samba/smb.conf

4 . Abrir un archivo para editar con Vi posicionando el cursor en una línea concreta (en este caso en la 24):

$ vi +24 /etc/apt/source.list

5 . Editar múltiples archivos. Iremos abriendo y guardado un archivo cada vez. Podemos pasar de un archivo a otro desde el modo comando de Vi con :n (guardamos cambios) o :n! si no queremos guardar:

$ vi archivo1 archivo2 ...archivoN

6 . Abrir un archivo con Vi situando el cursor en la primera ocurrencia de patrón:

$ vi +/patrón /etc/fstab

Modos de Vi

Vi podrá ser ejecutado en los siguientes modos:

  • Modo comando: Acepta letras independientes que son aceptadas como comandos, como por ejemplo ‘i‘ o ‘a‘ que pasan a modo inserción (de manera distinta) o el caracter ‘o‘ que crea una nueva línea bajo la actual
  • Modo ex: Utilizado para manipular archivos; guardar archivo y ejecutar programas externos (por ejemplo), bastará escribir ‘:‘ para pasar a este modo
  • Modo inserción: Es el modo en el que vi nos permite introducir texto en el archivo. Para regresar al modo comando pulsamos ‘Esc

Cuando accedemos a Vi por defecto nos encontramos en el modo comando. Podremos pasar al modo inserción con las siguientes teclas:

  • Insertar después del carácter donde se encuentra actualmente el cursor: a
  • Insertar antes del carácter donde se encuentra actualmente el cursor: i
  • Añadir al final de la línea en la que se encuentra el cursor: A
  • Añadir al principio de la línea en la que se encuentra el cursor: I
  • Entrar en modo reemplazo de caracter: R
  • Añadir una línea en blanco debajo de la línea en la que se encuentra el cursor y pasa a modo inserción: o
  • Añade una línea en blanco encima de la línea en la que se encuentra el cursor y pasa al modo inserción: O

En el modo insercción solo podremos insertar texto y movernos con las teclas RePág y AvPág.

Opciones que acepta Vi

En el modo comando además de las teclas anteriormente vistas (con las que pasamos a modo inserción) podremos realizar otras acciones:

Opciones de movimientos

  • j ó RETURN: Siguiente línea
  • k : Línea anterior
  • h : Carácter anterior
  • l : Siguiente carácter
  • [[ , H ó :0 : Ir al inicio del archivo
  • ]] , L , G ó :$ : Ir al final del fichero
  • :n : Donde ‘n‘ es la línea en la que nos queremos posicionar
  • := : Muestra la línea actual
  • Ctrl+F : Ir a la siguiente pantalla
  • Ctrl+B : Ir a la pantalla anterior
  • Ctrl+D : Avanzar media pantalla
  • Ctrl+U : Retroceder media pantalla

Operar con el archivo

  • :e : Edita un archivo indicado si no hay cambios en el archivo actual
  • :e! : Edita el archivo indicado, perdiendo las cambios en el archivo actual (en caso de que los hubiese)
  • :r : Copia/añade el contenido de un archivo en el actual (después de la línea en la que se encuentra el cursor)
  • :nr : Igual que el anterior pero lo añade a partir de la línea indicada con ‘n’
  • :sh : Ejecuta un shell sin salir de Vi. Para finalizar el shell deberemos de escribir “exit”
  • :!comando : Ejecuta el un comando externo pasado por ‘comando‘. Por ejemplo :!ls muestra los archivos del directorio actual.
  • :n,mw! : Guarda solo las líneas indicadas por el rango ‘n,m
  • :n,mw>>archivo : Añade en ‘archivo‘ las líneas comprendidas por el rango ‘n,m
  • :q : Sale de un archivo si los datos han sido guardados o no han habido cambios
  • :q! : Sale del archivo sin escribir cambios
  • :w : Guardar cambios
  • :w <nombre_archivo> : Guarda el fichero con un nombre específico
  • :wq , :x ó ZZ : Guarda los cambios y sale del editor

Copiar, pegar y borrar texto dentro de Vi

Antes de mostrar los comandos debemos de concocer una característica importante. Con gran parte de los siguientes comandos podremos utilizar un dígito precediendo al comando con lo que conseguiremos una repetición del comando, por ejemplo, el comando dd elimina una línea, pues 2dd borraría dos.

  • yy : Copia la línea en la que se encuentra el cursor. Admite dígitos de repétición. Se copiaría la línea del cursor y las ‘n’ siguientes. 3yy Copia la línea del cursor y las dos siguientes
  • p : Pega el contenido del buffer (las líneas copiadas) debajo de la línea del cursor
  • P : Igual que ‘p‘ pero en la línea superior a la que se encuentra el cursor
  • x : Borra el carácter donde se encuentra el cursor. Admite n dígitos por lo que se borrarán ‘n‘ carácteres incluido el del cursor.
  • dd : Elimina (corta) la línea en la que se encuentra el cursor. Igualmente podemos aplicar ‘n‘ líneas
  • dw : Borra la palabra en la que se encuentra el cursor. Admite n dígitos, por lo que se borrarán ‘n‘ palabras incluyendo a la del cursor.
  • D : Borra desde la posición del cursor hasta el final de la línea. Admite n dígitos, por lo que borraremos desde el cursor hasta el final de la línea y tantas líneas como hayamos especificado.
  • ~ : Cambia el carácter de minúscula a mayúscula (virgulilla)
  • u : Deshacer último cambio

Buscar texto y reemplazar

  • /patrón : Busca la cadena ‘patrón‘ desde la posición del cursor. Podemos continuar con la búsqueda (en caso de que exista mas de una coincidencia) con la letra n, o N si queremos ir a la coincidencia anterior.
  • ?patrón : Igual que el comando anterior pero invertido, es decir, busca desde la posición del cursor hacia arriba (hacia el principio del archivo)
  • :set ic : Ejecutar esto antes de comenzar una búsqueda (por ejemplo con /patrón) hará que no se tengan en cuenta las mayúsculas y las minúsculas.
  • :set noic : Es igual que el anterior pero si se tendrán en cuenta las mayúsculas y minúsculas.
  • :%s/original/sustituto/ : Cambia todas las entradas que coincidan con original por sustituto. Si cambiamos % por un numero de línea, solo se modificarán las palabras de esa linea. Si escribimos numero,numero se modificaran todas las palabras de esas lineas que coincidan con original. Si anulamos ‘%’ y cualquier número, solo modificaremos las ocurrencias de la línea en la que se encuentra el cursor.
  • :g/original/s//sustituto/: Igualmente cambiará todas las coincidencias de ‘original‘ por ‘sustituto‘. Sin la ‘g‘ solo modificaremos la primera ocurrencia.

 

Comandos Capítulo 4

 

Licencia Creative Commons
Curso LPIC-1 400 Capítulo 4 por nebul4ck se distribuye bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.

Anuncios

3 comentarios

  1. […] El motivo de estas tres entradas es poner en práctica los conocimientos obtenidos en el Capítulo 9 – El entorno de consola, shell scripts, el correo electrónico y uso básico de SQL de la guía de estudios para LPIC-1 400, así como la creación de usuarios Capítulo 7 – Administrar el sistema y el uso de comandos como gzip y tar Capítulo 4 – Fylesystem y Administrar archivos […]

    Me gusta

  2. […] Nota: Estos comandos son requisito para aprobar la certificación “Linux Professional Institute 1 modelo 400“.  El material para esta certificación podemos encontrarlo en este mismo blog y en especial el tema en el que se estudian estos comandos además de los comandos para comprimir archivos (Gzip, bzip2 y xz), Capítulo 4 “Filesystem y la administración de archivos” […]

    Me gusta

  3. […] LPIC-1 Capítulo 4. […]

    Me gusta

Deja un comentario, Gracias!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: