<< Back to man.lupaworld.com


[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ siguiente ]

Guía de referencia Debian
Capítulo 8 - Trucos para Debian


8.1 Arrancando el sistema

Véase el BootPrompt-HOWTO para información detallada sobre el indicador de arranque.


8.1.1 "¡Olvidé la contraseña de superusuario!" (1)

Es posible arrancar el sistema y acceder a la cuenta de superusuario sin conocer la contraseña siempre y cuando se tenga acceso al teclado de la consola (esto supone que ni la BIOS ni un cargador de arranque como lilo solicitan una contraseña para evitar el arranque del sistema)

Este es un procedimiento que no requiere de discos de arranque externos ni cambios en los parámetros de arranque de la BIOS. Aquí, "Linux" hace referencia al kernel de Linux de la instalación predeterminada de Debian.

En el pantalla de arranque de lilo, cuando aparece boot: (en algunos sistemas debe presionar la tecla Mayús para evitar el arranque automático y cuando lilo utiliza el framebuffer tiene que pulsar TAB para ver las opciones), escriba:

     boot: Linux init=/bin/sh

Esto hará que el sistema arranque el kernel y ejecute el /bin/sh en vez del estándar init. Ahora tenemos privilegios de superusuario y acceso al intérprete de comandos. Puesto que / generalmente está montado en modo sólo lectura y aún no han sido montadas las distintas particiones, debe hacer lo siguiente para tener un sistema que funcione razonablemente.

     init-2.03# mount -n -t remount,rw /
     init-2.03# mount -avt nonfs,noproc,nosmbfs
     init-2.03# cd /etc
     init-2.03# vi passwd
     init-2.03# vi shadow

(si el segundo campo de datos en el /etc/passwd es una "x" para cada nombre de usuario, su sistema utiliza contraseñas ocultas y debe editar el archivo /etc/shadow) Para desactivar la contraseña de root, edite el segundo campo de datos en el archivo de contraseñas de modo que quede vacío. Ahora se puede reiniciar el sistema y entrar como root sin contraseña. A diferencia de algunas distribuciones Linux antiguas, la Debian actual (Potato) requiere de contraseña sólo cuando arranca en el nivel de ejecución 1.

Resulta una buena idea tener un editor mínimo en /bin en el caso que /usr no sea accesible (véase Editores de rescate, Sección 11.2).

También considere instalar el paquete sash. Cuando no pueda arrancar el sistema, haga:

     boot: Linux init=/bin/sash

sash sirve como un sustituto interactivo de sh incluso cuando /bin/sh no se puede usar. Está enlazado estáticamente e incluye diversas utilidades estándar incorporadas (teclee "help" en el indicador de comandos para una lista de referencia).


8.1.2 "¡Olvidé la contraseña de superusuario!" (2)

Arranque desde un disco de emergencia. Si /dev/hda3 es la partición raíz original, lo siguiente le permitirá editar el archivo de contraseñas tan fácilmente como antes.

     # mkdir fixit
     # mount /dev/hda3 fixit
     # cd fixit/etc
     # vi shadow
     # vi passwd

La ventaja de este enfoque sobre el anterior es que no se necesita conocer la contraseña de lilo (si existe). Pero para usarlo uno debe ser capaz de poder acceder a la configuración de la BIOS para permitir arrancar el sistema desde un disquete o CD si es que ya no está configurada como tal.


8.1.3 No puedo arrancar el sistema

Si se tomó la molestia de crear un disco de arranque durante la instalación, no habrá ningún problema. Si lilo se encuentra dañado, grabe el disco de arranque desde el disco de instalación de debian y arranque el sistema con él. En el indicador de arranque, suponiendo que la partición raíz de su instalación Linux es /dev/hda12 y que desea entrar al nivel de ejecución 3, escriba:

     boot: rescue root=/dev/hda12 3

De esta manera arrancará con un sistema prácticamente funcional usando el kernel del disquete (pueden existir pequeños inconvenientes debido a la falta de algunas características o módulos del kernel).

Véase también Instalar un paquete en un sistema que no arranca, Sección 6.3.6 si su sistema está dañado.

Si necesita un disquete de arranque personalizado, consulte el readme.txt del disco de rescate.


8.1.4 "¡Permítanme desactivar X al arrancar!"

Chasing unstable/sid is fun, but buggy xdm, gdm, kdm, and wdm started during the boot process can bite you bad.

Primero acceda al shell del superusuario escribiendo lo siguiente en el indicador de arranque:

     boot: Linux vga=normal s

En este caso, Linux es la etiqueta de la imagen del kernel que está arrancando. "vga=normal" nos asegurará que lilo se ejecute en una pantalla VGA normal y "s" (o "S") es el parámetro que se pasa a init para invocar el modo monousuario. Escriba la contraseña del superusuario en el símbolo de espera.

Existen distintas maneras de desactivar todos los demonios que arrancan con X:

Aquí, el número en rc2.d se debe corresponder al nivel de ejecución especificado en el /etc/inittab. Asimismo ?dm significa que necesita ejecutar el comando múltiples veces sustituyéndolo con xdm, gdm, kdm o wdm.

La primera de la lista es "la única manera verdadera" en Debian. La última es fácil pero sólo funciona en Debian y exige que que se configure el administrador de pantalla nuevamente usando dpkg-reconfigure. Los otros son métodos genéricos para deshabilitar demonios.

Aún puede continuar arrancando X mediante el comando startx desde cualquier consola de shell.


8.1.5 Otros trucos con el indicador de arranque

El sistema se puede arrancar en un nivel de ejecución particular y con una configuración determinada usando el indicador de arranque de lilo. Para más detalles consulte el BootPrompt-HOWTO (LDP).

Si desea arrancar el sistema en el nivel de ejecución cuatro, use la siguiente entrada para el indicador de arranque de lilo.

     boot: Linux 4

Si desea arrancar el sistema en modo monousuario y conoce la contraseña de superusuario, algunos de los siguientes ejemplos funcionará usando el indicador de arranque de lilo.

     boot: Linux S
     boot: Linux 1
     boot: Linux -s

Si desea arrancar el sistema con menos memoria de la que realmente posee el sistema (por ejemplo, 48MB en un sistema con 64MB), use la siguiente entrada para el indicador de arranque de lilo:

     boot: Linux mem=48M

Asegúrese de no especificar un valor mayor al tamaño de memoria real ya que si es así el kernel se colgará. Los núcleos antiguos y/o las placas madres con una BIOS antigua no usan la memoria por encima de los 64 MB, salvo que uno escriba mem=128M en el indicador de arranque o incluya una línea similar en el /etc/lilo.conf.


8.1.6 Configurando los parámetros de arranque (GRUB)

GRUB es un nuevo administrador de arranque del projecto Hurd y es mucho más flexible que lilo pero con un manejo ligeramente diferente de los parámetros de arranque.

     grub> find /vmlinuz
     grub> root (hd0,0)
     grub> kernel /vmlinuz root=/dev/hda1
     grub> initrd /initrd
     grub> boot

Aquí, debe tener presente los nombres de dispositivos que utiliza Hurd:

     Hurd/GRUB           Linux               MSDOS/Windows
      (fd0)               /dev/fd0            A: 
      (hd0,0)             /dev/hda1           C: (en general)
      (hd0,3)             /dev/hda4           F: (en general)
      (hd1,3)             /dev/hdb4           ?

Véase /usr/share/doc/grub/README.Debian y /usr/share/doc/grub-doc/html/ para más detalles.


8.2 Registro de actividades


8.2.1 Registrando las actividades del intérprete de comandos

La administración del sistema implica tareas mucho más elaboradas en un entorno Unix que un entorno común de una computadora personal. Asegúrese de saber lo básico sobre configuración por si acaso necesita recuperar el sistema de algún problema. Las herramientas gráficas de configuración basadas en X11 son agradables y convenientes pero a menudo inapropiadas en situaciones de emergencia.

En este contexto, el registro de las actividades del intérprete de comandos resulta ser una buena práctica especialmente como superusuario.

Emacs: utilice M-x shell para empezar a grabar en el búfer y C-x C-w para escribir el contenido del mismo en un archivo.

Intérprete de comandos: utilice el comando screen con "^A H" como se detalla en Intercambiando consolas con screen, Sección 8.6.27 o el comando script.

     $ script
     Script started, file is typescript
      ... hacer cualquier cosa ...
      Ctrl-D
     $ col -bx <typescript >savefile
     $ vi savefile

Se puede utilizar lo siguiente en vez del comando script:

     $ bash -i 2>&1 | tee typescript

8.2.2 Registrando las actividades en X

Si necesita registrar la imagen de una aplicación X, incluyendo una terminal xterm, utilice gimp (GUI). Puede capturar cada ventana o la totalidad de la pantalla. Otras alternativas son xwd (xbase-clients), import (imagemagick) y scrot (scrot).


8.3 Copiar y archivar un subdirectorio entero


8.3.1 Comandos básicos para copiar un subdirectorio entero

Si necesita reordenar la estructura de archivos, mueva el contenido incluyendo los enlaces a archivos mediante:

     Método estándar:
     # cp -a /directorio/fuente /directorio/destino # debe ser GNU
     # (cd /directorio/fuente && tar cf - . ) | \
             (cd /directorio/destino && tar xvfp - )
     Si existen enlaces duros, se necesita un método más elaborado:
     # cd /ruta/al/directorio/original
     # find . -depth -print0 | afio -p -xv -0a
     # /punto/de/montaje/del/nuevo/directorio
     En el caso de una conexión remota:
     # (cd /directorio/fuente && tar cf - . ) | \
         ssh usuario@host.dom (cd /directorio/destino && tar xvfp - )
     Si no hay archivos enlazados:
     # scp -pr usuario1@host1.dom:/directorio fuente \
               usuario2@host2.dom:/directorio/destino

En este caso, scp <==> rcp y ssh <==> rsh.

El método para copiar un subdirectorio entero está basado en la información proporcionada por Manoj Srivastava srivasta@debian.org de la lista debian-user@lists.debian.org.


8.3.2 cp

Inicialmente, cp no resultaba ser el candidato correcto ya que no desreferenciaba enlaces simbólicos ni tampoco preservaba enlaces duros. Otra cosa a considerar eran los archivos de tamaño muy pequeño.

GNU cp ha superado estas limitaciones. No obstante en sistemas que no son GNU cp puede aún tener problemas. Asimismo, no se pueden generar archivos portables pequeños usando cp.

     % cp -a . directorio_nuevo

8.3.3 tar

Tar soluciona algunos de los problemas que tenía cp con los enlaces simbólicos. Sin embargo, `cpio' maneja archivos especiales que el `tar' tradicional no puede manejar.

tar maneja múltiples enlaces duros colocando una única copia de un enlace en la cinta. El nombre asignado a dicha copia es el único que se puede usar para recuperar el archivo. En cambio, cpio coloca una copia de cada enlace de manera que para recuperar el archivo se puede utilizar el nombre de cualquiera de ellas.

El comando tar ha cambiado sus opciones para los archivos .bz2 al pasar de Potato a Woody, por lo tanto, use --bzip2 en los scripts en vez de su forma reducida -I (Potato) o -j (Woody).


8.3.4 pax

Es la nueva utilidad para archivar, portable y compatible POSIX (IEEE Std 1003.2-1992, páginas 380-388 (sección 4.48) y páginas 936-940 (sección E.4.48)). pax lee, escribe y lista los componentes de un directorio y copia la jerarquía de los mismos. La operación pax es independiente del formato específico del archivo y admite una amplia variedad de formatos.

Las implementaciones de pax son aún nuevas y están en pleno desarrollo.

     # apt-get install pax
     $ pax -rw -p e . directorio_nuevo
      o
     $ find . -depth  | pax -rw -p e  directorio_nuevo

8.3.5 cpio

cpio almacena o extrae archivos en o de un archivo tar o cpio. El archivo puede ser otro archivo del disco, una cinta magnética o una tubería.

     $ find . -depth -print0 | cpio --null --sparse -pvd new-dir

8.3.6 afio

afio es una mejor forma de tratar con archivos con formato cpio. Generalmente es más rápido que cpio, proporciona más opciones para utilizar con cintas magnéticas y maneja mejor la corrupción de los datos de entrada. Admite archivos multi-volumen durante su operación interactiva. Afio puede crear archivos empaquetados que son mucho más seguros que los empaquetados con tar o cpio. En un script, para realizar una copia de seguridad, afio tiene un comportamiento óptimo como 'motor para archivar'.

     $ find . -depth -print0 | afio -px -0a directorio_nuevo

Para crear todas mis copias de respaldo en una cinta uso afio.


8.4 Respaldos diferenciales y sincronización de datos

Los respaldos diferenciales y la sincronización de datos se pueden implementar mediante diversos métodos:

La combinación con uno de los métodos descriptos en Copiar y archivar un subdirectorio entero, Sección 8.3 y la automatización de tareas descripta en Planificar una actividad (cron, at), Sección 8.6.26 permitirán crear un buen sistema de respaldo.

Explicaré tres herramientas fáciles de usar.


8.4.1 Respaldos diferenciales con rdiff

rdiff-backup ofrece respaldos buenos y sencillos con historial diferencial para cualquier tipo de archivos incluyendo enlaces simbólicos. Para hacer una copia de respaldo de la mayor parte de ~/ en /mnt/respaldo:

     $ rdiff-backup --include ~/tmp/conservar --exclude ~/tmp  ~/ /mnt/respaldo

Para restaurar los datos de hace tres días de este archivo en ~/antiguo:

     $ rdiff-backup -r 3D /mnt/respaldo ~/antiguo

Véase rdiff-backup(1).


8.4.2 Copias de respaldo diarias con pdumpfs

pdumpfs es un sencillo sistema para realizar copias de respaldo diarias similar al dumpfs de Plan9 que preserva cada réplica diaria del sistema. Es posible acceder en cualquier momento a réplicas antiguas para obtener un archivo de un día determinado. ¡ Hagamos una copia de respaldo de nuestro directorio personal con pdumpfs y cron!

pdumpfs crea la réplica AAAA/MM/DD en el directorio de destino. Todos los archivos originales se copian al directorio réplica cuando pdumpfs se ejecuta por primera vez. A partir de la segunda vez y en adelante, pdumpfs copia sólamente archivos nuevos o actualizados y almacena los archivos sin modificar como enlaces duros a los archivos de la réplica del día previo para ahorrar espacio en disco.

     $ pdumpfs dir-orig dir-dest [dest-basename]

Véase pdumpfs(8).


8.4.3 Respaldos diferenciales con RCS

Changetrack registrará en forma regular los cambios de los archivos de configuración en archivos RCS. Véase changetrack(1).

     # apt-get install changetrack
     # vi changetrack.conf

8.5 Recuperar al sistema de un cuelgue


8.5.1 Mate el procesoi

Ejecute top para ver cuál es el proceso que está actuando de manera extraña. Pulse `P' para ordenar por tiempo de CPU, `M' para ordenar por uso de memoria y "k" para matar un proceso. En forma aternativa, se puede usar el estilo BSD ps aux | less o el System V ps -efH | less. La sintaxis del estilo System V muestra los ID de los procesos padres (PPID) que se pueden utilizar para matar un proceso hijo zombie (malfuncionamiento).

Utilice kill junto el ID del proceso para matar (o enviar una señal a) un proceso, killall para hacer lo mismo pero usando el nombre del comando. Señales de uso habitual:

      1: HUP,  reiniciar demonio
     15: TERM, terminar un proceso en forma normal
      9: KILL, matar un proceso sin contemplaciones

8.5.2 Alt-SysRq

La opción de compilación del kernel "Magic SysRq key" proporciona una protección contra el mal funcionamiento del sistema. Pulsando Alt-SysRq en una i386 y a continuación una de las teclas r 0 k e i s u b se obtiene el pase mágico.

Unraw restaura el teclado tras el cuelgue de X. Modifique el nivel de registro de la consola con 0 para reducir los mensajes de error. sak (tecla de atención del sistema) mata a todos los procesos en la consola virtual actual. tErminate mata a todos los procesos de la terminal actual salvo init. kill mata a todos los procesos incluyendo a init.

sync (sincronizar), umount (desmontar), y reboot (reiniciar) a menudo se utilizan en el caso de situaciones realmente complicadas.

En el momento de escribir este documento, los núcleos que vienen con la instalación predeterminada de Debian no han sido compilados con esta opción. Recompile el kernel para activarla. Se puede encontrar información detallada en: /usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz.


8.6 Algunos pequeños comandos útiles para tener en cuenta


8.6.1 Paginador

less es el paginador predeterminado (navegador del contenido de un archivo). Pulse `h' para obtener ayuda. Puede hacer muchas más cosas que more. less can be supercharged by executing eval $(lesspipe) or eval $(lessfile) in the shell start-up script. Véase más en /usr/share/doc/lessf/LESSOPEN. La opción -R permite la salida de caractéres raw y activa las secuencias de escape en color ANSI. Véase less(1).

w3mpuede ser un paginador alternativo útil para algunos sistemas de código (EUC).


8.6.2 Memoria disponible

free y top brindan una buena información sobre los recursos de memoria disponibles. No se preocupe por el tamaño que figura bajo "used" de la línea "Mem:" sino por el valor que se encuentra justo debajo de él (38792 en el siguiente ejemplo).

     $ free -k # para una máquina con 256MB
                  total       used       free     shared    buffers cached
     Mem:        257136     230456      26680      45736     116136 75528
     -/+ buffers/cache:      38792     218344
     Swap:       264996          0     264996

La cantidad de memoria física exacta se puede confirmar haciendo grep '^Memory' /var/log/dmesg. En este caso arroja el siguiente resultado: "Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)".

     Total         = 262144k = 256M (1k=1024, 1M=1024k)
     Free to dmesg = 256984k = Total - kernel - reserved - data - init
     Free to shell = 257136k = Total - kernel - reserved - data

El sistema no puede usar cerca de 5MB ya que lo utiliza el propio kernel.


8.6.3 Configurar fecha y hora (BIOS)

     # date MMDDhhmmCCYY
     # hwclock --utc --systohc
     # hwclock --show

Esto fijará la fecha y hora del sistema y del hardware en MM/DD hh:mm, CCYY. La hora se muestra según el huso horario local pero el hardware utiliza el UTC..


8.6.4 Configurar hora (NTP)

Referencia: Managing Accurate Date and Time HOWTO.


8.6.4.1 Configurar la fecha y hora con una conexión a Internet permanente

Configure el reloj del sistema para corregir la fecha y hora en forma automática mediante un servidor remoto:

     # ntpdate server

Si su sistema posee una conexión a Internet permanente, resulta interesante incluirlo en /etc/cron.daily/.


8.6.4.2 Configurar la hora y fecha con una conexión a Internet no permanente

Use el paquete chrony.


8.6.5 Como controlar características de la consola tales como el protector de pantalla

Para descativar el protector de pantalla, utilice los siguientes comandos:

En la consola de Linux:

     # setterm -powersave off

Ejecute la consola kon2 (kanji) con:

     # kon -SaveTime 0

Cuando esté ejecutando X:

     # xset s off
      o
     # xset -dpms
      o
     # xscreensaver-command -prefs

Consulte las correspondientes páginas del manual para controlar otras características de la consola. Véase también stty(1) for changing and printing


8.6.6 Búsqueda en la base de datos administrativa

Glibc ofrece getent(1) para buscar entradas en la base de datos administrativa (passwd, group, hosts, services, protocols o networks).

     getent database [clave ...]

8.6.7 Desactivar el sonido (bip)

Uno siempre puede desenchufar el parlante del PC ;-). Para el intérprete de comandos:

     echo "set bell-style none">> ~/.inputrc:

8.6.8 Mensajes de error por pantalla

Para hacer desaparecer los mensajes de error por pantalla, el primer lugar a verificar es /etc/init.d/klogd. Fije KLOGD="-c 3" en este script y ejecute /etc/init.d/klogd restart. Un método alternativo consiste en ejecutar dmesg -n3.

Veamos el significado de los niveles de error:

Si un mensaje de error inútil lo molesta continuamente, considere crear un parche para el kernel sencillo tal como shutup-abit-bp6 (disponible en el subdirectorio de ejemplos).

Otro lugar que hay que ver es el /etc/syslog.conf; verifique si los mensajes de error se envían a la consola.


8.6.9 Configurar la consola

En sistemas tipo UNIX se accede a las pantallas de la consola mediantes rutinas de la biblioteca (n)curses. Éstas brindadn al usuario un método independiente del terminal de actualizar las pantallas de caracteres con una optimización razonable. Véase ncurses(3X) y terminfo(5).

En un sistema Debian, existe una infinidad de entradas predefinidas:

     $ toe | less                  # todas las entradas
     $ toe /etc/terminfo/ | less   # entradas reconfigurables por el usuario

Exporte su elección mediante la variable de entorno TERM.

Si la entrada terminfo para xterm no funciona con una xterm no-Debian, cuando acceda a un sistema Debian en forma remota cambie el tipo de su terminal de "xterm" a una de las versiones con menos características como, por ejemplo, "xterm-r6". Véase /usr/share/doc/libncurses5/FAQ para más información.


8.6.10 Volver la consola a su estado normal

Si la pantalla se enloquece después de hacer cat some-binary-file (quizás no pueda ver el comando que ingresa mientras escribe) haga:

     $ reset

8.6.11 Convertir un archivo de texto en formato DOS a formato Unix

Convertir un archivo de texto en formato DOS (fin-de-línea=^M^J) en un archivo Unix (^J).

     # apt-get install sysutils
     $ dos2unix dosfile

8.6.12 Sustitución de expresiones regulares

Para reemplazar todas las instancias FROM_REGEX por TO_TEXT en todos los archivos FILES ...:

     $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;'
     FILES ....

-i es para "editar en el lugar", -p significa "bucle implícito sobre los archivos FILES ...". Si la sustitución es compleja, la recuperación ante posibles errores resulta más fácil usando el parámetro -i.bak en vez de -i. De esta manera se conservará una copia de los archivos originales a los que se les agregará la extensión .bak.


8.6.13 Editar un archivo con un script

El siguiente script eliminará las líneas de la 5 a la 10 y desde la 16 a la 20.

     #!/bin/bash
     ed $1 <<EOF
     16,20d
     5,10d
     w
     q
     EOF

Aquí, los comandos ed son los mismos que los del modo comando de vi. La edición de archivos de esta manera facilita la creación de scripts.


8.6.14 Extraer diferencias y combinar actualizaciones entre archivos fuente

Siguiendo uno de los siguientes procedimientos se extraerán las diferencias entre dos archivos fuente y se crearán los archivos unificados diff archivo.parche0 o archivo.parche1 según la ubicación del archivo:

     $ diff -u archivo.original archivo.nuevo1 >
     archivo.parche0
     $ diff -u archivo/original archivo/nuevo1 >
     archivo.parche1

El archivo diff (llamado también parche) se utiliza para enviar actualizaciones de programas. La parte recibida aplicará esta actualización a otro archivo mediante:

     $ patch -p0 archivo < archivo.parche0
     $ patch -p1 archivo < archivo.parche1

Si tiene tres versiones del código fuente, puede combinarlos efectivamente usando diff3:

     $ diff3 -m archivo.mío archivo.original
     archivo.tuyo > archivo

8.6.15 Convertir un archivo grande en archivos más pequeños

     $ split -b 650m archivo   # dividir el archivo en partes de 650 MB
     $ cat x* >archivo_grande  # unir los archivos en un archivo grande

8.6.16 Extraer datos de una tabla contenida en un archivo de texto

Consideremos un archivo de texto llamado DPL en donde todos los nombres de los líderes del proyecto Debian y el día de su asunción están listados separados entre sí mediante espacios.

     Ian     Murdock   Agosto  1993
     Bruce   Perens    Abril   1996
     Ian     Jackson   Enero   1998
     Wichert Akkerman  Enero   1999
     Ben     Collins   Abril   2001
     Bdale   Garbee    Abril   2002
     Martin  Michlmayr Marzo   2003

A menudo, se utiliza Awk para extraer datos de este tipo de archivos.

     $ awk '{ print $3 }' <DPL                   # mes de asunción
     August
     April
     January
     January
     April
     April
     March
     $ awk '($1=="Ian") { print }' <DPL          # DPL llamado Ian
     Ian     Murdock   Agosto  1993
     Ian     Jackson   Enero   1998
     $ awk '($2=="Perens") { print $3,$4 }' <DPL # Cuando Perens asumió 
     Abril 1996

Los intérpretes de comandos como el Bash pueden también utilizarse para analizar este tipo de archivo:

     $ while read primero último mes año; do 
         echo $mes
       done <DPL
     ... la misma salida que en el primer ejemplo Awk

En este caso, el comando incorporado read utililiza las caracteres de $IFS (separadores de campo internos, con sus siglas en inglés) para dividir líneas en palabras.

Si cambian IFS a ":", puede analizar perfectamente el /etc/passwd con el shell:

     $ originalIFS="$IFS"   # guarda el valor original
     $ IFS=":"
     $ while read user password uid gid resto_de_la_línea; do
         if [ "$user" = "osamu" ]; then 
           echo "el ID de $user es $uid"
         fi
       done < /etc/passwd
     El ID de osamu es 1001
     $ IFS="$originalIFS"   # devuelve valor anterior

(Si utiliza Awk para hacer lo mismo, utilice FS=":" para configurar el separador de campo)

IFS también es utilizado por el intérprete de comandos para dividir la espansión de parámetros, la sustitución de comandos y la expansión aritmética. Esto no sucede con palabras entre comillas simples o dobles. El valor predeterminado de IFS es <espacio>, <tab> y <nueva_línea> combinados.

Sea cuidadoso al usar estos trucos con el IFS del intérprete de comandos. Pueden ocurrir cosas extrañas cuando el shell interpreta parte de un script como si se fuese su entrada.

     $ IFS=":,"                        # utiliza ":" y "," como IFS
     $ echo IFS=$IFS,   IFS="$IFS"     # echo es un comando del Bash
     IFS=  , IFS=:,
     $ date -R                         # simplemente la salida de un comando
     Sat, 23 Aug 2003 08:30:15 +0200
     $ echo $(date -R)                 # subshell --> entrada al shell principal
     Sat  23 Aug 2003 08 30 36 +0200
     $ unset IFS                       # volver al IFS predeterminado
     $ echo $(date -R)
     Sat, 23 Aug 2003 08:30:50 +0200

8.6.17 Pequeños scripts que incluyen tuberías

Los siguientes scripts realizan tareas útiles utilizando tuberías.

     find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
                          # encontrar todos los archivos en /usr
                          # excluyendo algunos archivos
     xargs -n 1 command   # ejecutar comando para todos los ítems de la stdin
     xargs -n 1 echo|     # escribir ítems separados por espacios en blanco
                          # en renglones
     grep -e patrón|      # extraer líneas con un determinado
     patrón
     cut -d: -f3 -|       # extraer el tercer campo separado por :  
                          # (archivo passwd, etc.)
     awk '{ print $3 }' | # extraer el tercer campo separado por espacios en blanco
     awk -F'\t' '{ print $3 }' |
            # extaer el tercer campo separado por tabulaciones
     col -bx |            # eliminar retrocesos y convertir tabulaciones en
                          # espacios
     expand -|            # transformar las tabulaciones
     sort -u|             # ordenar y eliminar duplicados
     tr '\n' ' '|         # concatenar líneas en una sola línea
     tr '\r' ''|          # eliminar CR (retornos de carro)
     tr 'A-Z' 'a-z'|      # convertir mayúsculas en minúsculas
     sed 's/^/# /'|       # transformar cada línea en un comentario
     sed 's/\.ext//g'|    # eliminar .ext
     sed  -n -e 2p|       # mostrar la segunda línea 
     head -n 2 -|         # mostrar las primeras 2 líneas
     tail -n 2 -|         # mostrar las últimas 2 líneas

8.6.18 Pequeños scripts para recorrer distintos archivos

Las siguientes maneras de recorrer distintos archivos que coincidan con *.ext asegura un correcto manejo de nombres de archivos extraños -como los que incluyen espacios- y realizan la misma tarea:


8.6.19 La locura de los script cortos en Perl

Aunque todos los scripts en Awk se pueden reescribir automáticamente en Perl usando a2p(1), los scripts Awk de una sola línea en Awk se convierten mejor en scripts en perl de una línea en forma manual. Por ejemplo

     awk '($2=="1957") { print $3 }' |

es equivalente a cualquiera de las siguientes líneas:

     perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
     perl -lane 'print $F[2] if $F[1] eq "1957"' |

Se pueden eliminar todos los espacios en los argumentos de perl de la línea anterior y tomar ventaja de la conversión automática entre números y cadena de caracteres que existe en Perl:

     perl -lane 'print$F[2]if$F[1]eq+1957' |

Véase perlrun(1) para las opciones de la línea de comandos. Para más scripts delirantes en Perl, puede resultar interesante http://perlgolf.sourceforge.net.


8.6.20 Obtener el texto de una página web o del archivo de una lista de correos

Lo siguiente leerá una página web como un archivo de texto. Resulta muy útil cuando se desea copiar configuraciones que se obtienen de la red.

     $ lynx -dump http://www.remote-site.com/help-info.html
     >archivo_de_texto

Aquí también se pueden usar links y w3m, con ligeras diferencias en el renderizado.

Si se trata de un archivo de una lista de correo, use munpack para obtener los contenidos mime del texto.


8.6.21 Impresión de una página web

Lo siguiente imprimirá una página web en una impresora/archivo PostScript.

     $ apt-get install html2ps
     $ html2ps URL | lpr

Véase lpr/lpd, Sección 3.6.1. También tenga en cuenta los paquetes a2ps y mpage para crear archivos PostScript.


8.6.22 Impresión de la página una página del manual

Lo siguiente imprimirá una página manual en una impresora/archivo PostScript.

     $ man -Tps alguna-página-del-manual | lpr
     $ man -Tps alguna-página-del-manual | mpage -2 | lpr

8.6.23 Combinar dos archivos PostScript o PDF

Es posible combinar dos archivos PostScript o PDF.

     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
     -sOutputFile=bla.ps -f \
     loquesea1.ps loquesea2.ps
     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
       -sOutputFile=bla.pdf -f loquesea1.pdf\
       loquesea2.pdf

8.6.24 El tiempo de un comando

Mostrar el tiempo empleado por un proceso.

     # time algún-comando >/dev/null
     real    0m0.035s       # tiempo de reloj (tiempo real transcurrido)
     user    0m0.000s       # tiempo en modo usuario
     sys     0m0.020s       # tiempo en modo kernel

8.6.25 El comando nice

Use nice (del paquete GNU shellutils) para fijar el valor "nice" de un comando al ejecutarlo. renice (bsdutils) y top puede modificar el valor "nice" de un proceso. El proceso más lento tiene el valor 19 (prioridad más baja); los valores negativos son "not-nice". El valor -20 lo tiene el proceso más veloz (prioridad alta). Sólo el superusuario puede fijar valores "nice" negativos.

     # nice  -19 top                                         # muy lento
     # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # muy rápido

A veces un valor extremo de nice hace más daño que bien al sistema. Utilice este comando con cuidado.


8.6.26 Planificar una actividad (cron, at)

Use cron y at para planificar tareas en Linux. Véase at(1), crontab(5), crontab(8).

Ejecute el comando crontab -e para crear o editar el archivo crontab para configurar eventos planificados. Ejemplo de un archivo crontab:

     # utilice /bin/sh para ejecutar los comandos sin importar lo que dice el
     # /etc/passwd
     SHELL=/bin/sh
     # envíe un mensaje a `pablo' sin importar a quien pertenece el crontab
     MAILTO=pablo
     # Minuto Hora Día_del_mes Mes Día_de_la_semana comando
     # ejecutar todos los días a las 00:05
     5  0  *  * *   $HOME/bin/tarea.diaria >> $HOME/tmp/salida 2>&1
     # ejecutar a las 14:15 el primer día de cada mes -- enviar salida a Pablo
     15 14 1  * *   $HOME/bin/mensual
     # ejecutar a las 22:00 todos los días hábiles (1-5), molestar a José. 
     # % para nueva línea, el último % para cc:
     0 22 *   * 1-5 mail -s "Son las 10 de la noche" josé%José:%%¿Dónde están
                             los chicos?%.%%
     23 */2 1 2 *   echo "ejecutar el 1 de febrero a los 23 minutos después
                          de 0am, 2am, 4am ..."
     5  4 *   * sun echo "ejecutar todos los domingos a las 04:05"
     # ejecutar a las 03:40 el primer lunes de cada mes
     40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && comando -args

Ejecutar el comando at para planificar una tarea una sola vez:

     $ echo 'command -args'| at 3:40 monday

8.6.27 Intercambiando consolas con screen

El programa screen permite ejecutar múltiples terminales virtuales, cada una con su intérprete de comandos interactivo, en una única terminal física o ventana que emule un terminal. Incluso si utiliza consolas virtuales Linux o múltiples ventanas xterm, merece la pena experimentar con screen por sus amplias funcionalidades que incluye:


8.6.27.1 Acceso remoto

Si frecuentemente se conecta a una máquina Linux desde un terminal remoto o usando el terminal VT100, screen le facilitará muchísimo las cosas.

  1. Supongamos que estamos conectado a la red mediante una conexión telefónica ejecutando una sesión compleja de screen con editores y otros programas abiertos en diversas ventanas.
  2. De repente necesita abandonar su terminal, pero no deseamos perder nuestro trabajo al colgar la línea.
  3. Simplemente teclee ^A d para separar las sesión y desconéctese (o aún más rápido, teclee ^A DD para que screen se separe y se desconecte por sí misma)
  4. Cuando se conecte nuevamente, escriba el comando screen -r y screen mágicamente automáticamente recuperará todas las ventanas que había abierto.

8.6.27.2 Comandos de screen típicos

Una vez que arranca screen toda la entrada de datos que se hace a través del teclado se envía a la ventana actual excepto la combinación de teclas de comando, por defecto ^A. Todos los comandos de screen se ingresan escribiendo ^A seguido de una sola tecla [y eventualmente algunos parámetros]. Algunos comandos útiles:

     ^A ?     mostrar ventana de ayuda (muestra las asociaciones de teclas)
     ^A c     crear una nueva ventana y cambiar a ella
     ^A n     ir a la siguiente ventana
     ^A p     ir a la ventana anterior
     ^A 0     ir a la ventana número 0
     ^A w     mostrar la lista de ventanas
     ^A a     enviar un Ctrl-A a la ventana actual como entrada del teclado
     ^A h     grabar una copia de la ventana actual a un archivo 
     ^A H     comenzar/finalizar la grabación de ventana actual en un archivo
     ^A ^X    bloquear la terminal (protegida con contraseña)
     ^A d     separar una sesión del terminal
     ^A DD    separar una sesión y salir

Éste es sólo una pequeña muestra de los comandos y características de screen. Si hay algo que desea que screen haga, ¡existe una gran posibilidad que pueda hacerlo!. screen(1) para más detalles.


8.6.27.3 Tecla de retroceso y/o Ctrl-H en un sesión de screen

Si comprueba que la tecla de retroceso y/o Ctrl-H no funciona correctamente cuando ejecuta screen, edite el archivo /etc/screenrc, localice la línea

     bindkey -k kb stuff "\177"

y coméntela (es decir, agréguele el carácter "#" al principio).


8.6.27.4 Programa para X equivalente a screen

Consulte xmove. Véase xmove(1).


8.6.28 Probando la red

Instale netkit-ping, traceroute, dnsutils, ipchains (para el kernel 2.2), iptables (para el kernel 2.4 ) y el paquete net-tools:

     $ ping yahoo.com # verificar la conexión a Internet
     $ traceroute yahoo.com      # rastrear paquetes IP
     $ ifconfig                  # verificar la configuración del 
                                 # anfitrión (host)
     $ route -n                  # verificar la configuración de la ruta
     $ dig [@dns-server.com] host.dom [{a|mx|any}] |less
           # verificar registros host.dom DNS [@ dns-server.com] para  
           # un registro {a|mx|any}
     $ ichains  -L -n |less      # verificar filtrado de paquetes (kernel 2.2)
     $ iptables -L -n |less      # verificar filtrado de paquetes (kernel 2.4)
     $ netstat -a                # mostrar todos los puertos abiertos
     $ netstat -l --inet         # mostrar los puertos en escucha
     $ netstat -ln --tcp         # mostrar puertos tcp en escucha (numérico)

8.6.29 Eliminar mensajes de la cola local

Para eliminar los mensajes de la cola local:

     # exim -q    # eliminar mensajes en espera
     # exim -qf   # eliminar todos los mensajes
     # exim -qff  # eliminar incluso mensajes bloqueados

"-qff" puede resultar mejor para el script /etc/ppp/ip-up.d/exim. Para Sarge, reemplace exim con exim4.


8.6.30 Eliminar mensajes bloqueados de la cola local

Para eliminar mensajes de correo bloqueados de la cola local reenviando el mensaje de error:

     # exim -Mg `mailq | grep frozen | awk '{ print $3 }'`

Para Sarge, reemplace exim por exim4


8.6.31 Redistribuir los contenidos de mbox

Si se llenó su directorio personal y procmail falló necesitará distribuir en forma manual sus mensajes de /var/mail/usuario a los buzones de correo situados en su directorio personal. Luego de hacer espacio en el mismo, haga:

     # /etc/init.d/exim stop
     # formail -s procmail </var/mail/usuario
     # /etc/init.d/exim start

Para Sarge, reemplace exim por exim4.


8.6.32 Borrar el contenido de un archivo

Para borrar el contenido de un archivo (un archivo log, por ej.) no utilice rm para eliminarlo y mkdir para crealo nuevamente, ya que el archivo puede estar siendo consultado en el intervalo comprendido entre la ejecución de ambos comandos. Lo siguiente es la manera más segura de borrar el contenido de un archivo.

     $ :>archivo-a-eliminar

8.6.33 Archivos fantasma

Los siguientes comandos creará archivos fantasmas (archivos vacíos):

     $ dd if=/dev/zero  of=nombre_archivo bs=1k count=5 # 5KB de
                                                                   # contenido
                                                                   # cero
     $ dd if=/dev/urandom of=nombre_archivo bs=1m count=7 # 7MB de
                                                                     # contenido
                                                                     # al azar
     $ touch nombre_archivo  # crear un archivo de 0B (si el archivo
                                        # existe actualizar mtime)

Por ejemplo, los siguientes comandos ejecutados desde el shell de un disco de arranque Debian borrará íntegramente el contenido del disco duro /dev/hda.

     # dd if=/dev/urandom of=/dev/hda ; dd if=/dev/zero of=/dev/hda

8.6.34 chroot

El programa chroot, chroot(8), nos permite ejecutar diferentes instancias de un entorno GNU/Linux en un único sistema, simultáneamente y sin reiniciar.

Asimismo, uno puede ejecutar un programa que insuma gran cantidad de recursos (por ejemplo, apt-get o dselect) bajo el chroot de una máquina anfitrión veloz, montando en ella una máquina auxiliar lenta (máquina satélite) mediante NFS en modo lectura/escritura, siendo el punto de montaje el directorio chroot.


8.6.34.1 Ejecutar distintas versiones de Debian mediante chroot

Un entorno chroot Debian se puede crear en Woody fácilmente mediante el comando debootstrap. Por ejemplo, para crear un chroot Sid en /sid-root con una conexión de Internet rápida:

     main # cd / ; mkdir /sid-root
     main # debootstrap sid /sid-root http://ftp.debian.org/debian/
     ... observe descargar todo el sistema
     main # echo "proc-sid /sid-root/proc proc none 0 0" >> /etc/fstab
     main # mount proc-sid /sid-root/proc -t proc
     main # cp /etc/hosts /sid-root/etc/hosts
     main # chroot /sid-root /bin/bash
     chroot # apt-setup # configurar /etc/apt/sources.list
     chroot # vi /etc/apt/sources.list # apuntar a la rama inestable
     chroot # dselect  # puede usar aptitude, instalar mc y vim :-)

A esta altura, debería tener un sistema Debian totalmente funcional, donde podrá jugar sin temor de afectar su instalación Debian principal.

Este truco con debootstrap se puede utilizar para instalar Debian en un sistema sin usar Debian install disk but using one for another GNU/Linux distribution. Véase http://www.debian.org/releases/stable/i386/ch-preparing#s-linux-upgrade.


8.6.34.2 Configurar el acceso para chroot

Escribir chroot /sid-root /bin/bash es fácil, pero conserva toda clase de variables de entorno que quizás no desee y acarrea otros problemas. Un mejor enfoque consiste en ejecutar otro proceso login en una terminal virtual aparte donde pueda entrar al sistema chroot directamente.

Puesto que, en los sistemas Debian predeterminados, las consolas Linux se ejecutan desde tty1 hasta tty6 y el sistema X Window se ejecuta en tty7, configuremos, como ejemplo, una consola chroot en tty8. Luego de crear un sistema chroot como se explicó en Ejecutar distintas versiones de Debian mediante chroot, Sección 8.6.34.1, escriba desde el shell del superusuario en el sistema principal:

     main # echo "8:23:respawn:/usr/sbin/chroot /sid-root "\
            "/sbin/getty 38400 tty8"  >> /etc/inittab
     main # init q    # vuelve a cargar init

8.6.34.3 Configurando X para chroot

¿Desea ejecutar la última versión de X y Gnome en forma segura en su chroot? ¡Es perfectamente posible! El siguiente ejemplo hará que GDM se ejecute en un terminal virtual vt9.

Primero instale el sistema chroot usando el método descripto en Ejecutar distintas versiones de Debian mediante chroot, Sección 8.6.34.1. Siendo superusuario en el sistema principal, copie los archivos de configuración claves en el sistema chroot.

     main # cp /etc/X11/XF86Config-4 /sid-root/etc/X11/XF86Config-4
     main # chroot /sid-root # o utilice la consola chroot
     chroot # apt-get install gdm gnome x-window-system
     chroot # vi /etc/gdm/gdm.conf # haga s/vt7/vt9/ en la sección [servers]
     chroot # /etc/init.d/gdm start

En este caso, se editó /etc/gdm/gdm.conf para que la consola virtual inicial sea vt9 en vez de vt7.

A partir de ahora, puede fácilmente alternar entre el entorno X del chroot y su sistema principal simplemente cambiando de terminal virtual; por ejemplo, usando Ctrl-Alt-F7 y Ctrl-Alt-F9. ¡Que se diviertan!

[FIXME] Añadir un comentario y enlace al script init del gdm del chroot.


8.6.34.4 Ejecutar otra distribución con chroot

Se puede crear fácilmente un entorno chroot para otra distribución Linux. Instale un sistema en una partición aparte usando el instalador de otra distribución. Si su partición raíz se encuentra en /dev/hda9:

     main # cd / ; mkdir /otra-dist
     main # mount -t ext3 /dev/hda9 /otra-dist
     main # chroot /otra-dist /bin/bash

Luego proceda como en Ejecutar distintas versiones de Debian mediante chroot, Sección 8.6.34.1, Configurar el acceso para chroot, Sección 8.6.34.2 y Configurando X para chroot, Sección 8.6.34.3.


8.6.34.5 Compilar un paquete con chroot

Existe un paquete chroot más sofisticado, pbuilder, que crea un sistema chroot y compila un paquete dentro de él. Es un sistema ideal para verificar que las dependencias de compilación de un paquete sean correctas y para estar seguros que no existan dependencias innecesarias o erróneas en el paquete resultante.


8.6.35 Cómo verificar los enlaces duros

Puede ver si dos archivos son uno solo con dos enlaces duros, haciendo:

      
     $ ls -li archivo1 archivo2

8.6.36 Montar una imagen del disco duro

Si archivo.img contiene una imagen de los contenidos de un disco duro y el disco original tenía una configuración xxxx = (bytes/sector) * (sectores/cilindro), entonces lo siguiente la montará en /mnt:

     # mount -o loop,offset=xxxx archivo.img /mnt

Obsérvese que la mayoría de los discos duros tienen 512 bytes/sector.


8.6.37 Samba

Lo básico para obtener archivos desde Windows:

     # mount -t smbfs -o username=mi_nombre,uid=mi_uid,gid=mi_gid \
         //server/share /mnt/smb  # monta un directorio Windows en Linux
     # smbmount //server/share /mnt/smb \
       -o "username=mi_nombre,uid=mi_uid,gid=mi_gid"
     # smbclient -L 192.168.1.2 # lista los archivos compartidos de una
                                           # máquina

Los vecinos de Samba se pueden localizar desde Linux haciendo:

     # smbclient -N -L dirección_ip_de_su_PC | less
     # nmblookup -T "*"

8.6.38 Utilidades para otros sistemas de archivos

El kernel de Linux soporta diversos sistemas de archivos. Por lo tanto, se puede acceder a ellos montando los dispositivos que los contienen. Para determinados sistemas de archivos, existen algunas herramientas especializadas para acceder a ellos sin tener que montar los correspondientes dispositivos. Estas operaciones se realizan por programas del espacio del usuario, con lo cual no se necesita el soporte de sistemas de archivos del kernel.

dosfstools resulta útil para crear y verificar sistemas de archivos FAT MS-DOS..


8.7 Errores típicos a tener presente

Veamos algunos ejemplos de acciones peligrosas. El impacto negativo será mayor si utiliza la cuenta con privilegios de superusuario.


8.7.1 rm -rf .*

En "rm -rf .*", el ".*" se expande para incluir "." y "..", y si por casualidad tiene privilegios para escribir en el directorio padre, terminará por eliminar todos los directorios next to your current directory as well.


8.7.2 rm /etc/passwd

Es difícil la pérdida de algunos archivos importantes como /etc/passwd por descuido. El sistema Debian realiza copias de seguridad regulares de ellos en /var/backups/. Al restaurar estos archivos, tiene que configurar manualmente los permisos adecuados.

     # cp /var/backups/passwd /etc/passwd
     # chmod 644 /etc/passwd

Véase también Recuperar los datos de la selección de paquetes, Sección 6.3.4.


[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ siguiente ]

Guía de referencia Debian

CVS, lun abr 3 22:57:45 UTC 2005

Osamu Aoki osamu@debian.org
Coordinador de la traducción al español: Walter O. Echarri wecharri@infovia.com.ar
Autores, Sección A.1