Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Trabajar con imágenes desde el prompt

Veremos varios ejemplos, pero primero instalamos ImageMagick:
# aptitude install imagemagick

Convertimos de pdf a imagenes y viceversa:
$ convert -density 150 archivo1.pdf img_%04d.tiff
$ convert *.png archivo2.pdf

Rotamos las imagenes 180 grados:
$ mogrify -rotate 180 *tiff

Cambiamos el formato de las imagenes:
$ mogrify -format png *tiff
$ convert imagen.jpg imagen.png

Cambiamos la profundidad de color:
$ mogrify -colors 16 *png

Cambiamos el tamaño de las imagenes:
$ mogrify -resize 50% *png
$ mogrify -resize 1024×768 *.png
$ mogrify -quality 75-type optimize -resize 1024×768 *.png

Obtenemos informacion sobre una imagen:
$ identify imagen.jpg

Cambiar imagenes a bn:
$ convert imagen_color.jpg -monochrome imagen_bn.jpg

Añadir un texto a una imagen:
$ convert -font courier -fill yellow -pointsize 25 -draw ‘text 100,250 guimi’ imagen.jpg imagen_con_txt.jpg

Incluimos una imagen “firma” -con fondo transparente- en la esquina inferior derecha de otra imagen:
$ combine -gravity SouthEast -compose Over imagen_original.jpg firma.png imagen_firmada.jpg
$ convert -draw ‘image Over 100,100 225,225 firma.png’ imagen_original.jpg
Podemos ver más ejemplos de cómo firmar imágenes en otro post de este blog llamado firmar imágenes.

Crear un índice gráfico con miniaturas:
$ convert “vid:*jpg” indice.png
Crear un índice gráfico con miniaturas (utiliza GUI para mostrar el resultado):
$ display “vid:*.jpg”

Crear un gif animado con varios jpg:
$ convert -delay 15 *.jpg imagen_animada.gif
Extraer los fotogramas de una imagen animada:
$ convert imagen_animada.gif -adjoin imagen.jpg

Trabajar con imágenes desde el prompt, editar y modificar imágenes desde la línea de comandos

Iptables

Mini introducción

Hay muchos manuales sobre iptables, aunque ninguno explica todo lo que hay que hacer para tener iptables funcionando de principio a fin.
Unos dicen como gestionar las reglas de iptables, crear chains, accept, drop… todo eso.
Otros -pocos- indican como hacer que iptables cargue las reglas en el arranque, “parar” iptables, volver a ponerlo en marcha…
Este texto es aún peor, no enseña nada… pero sirve de guía para poner a funcionar iptables de principio a fin.
 
Si se desea algo más ambicioso que un simple cortafuegos local, tambien tengo una guía completa para montar un Cortafuegos (Router-Firewall) con Proxys transparentes (web proxy y pop3 proxy) con Debian GNU/Linux + iptables + squid + p3scan + clamav + spamassassin.
 
Vamos a ello. Primero hay que generar un script que cree tus reglas iptables. Puedes seguir por ejemplo las guías de pello [1][2].
Tambien puedes ver mi script.
 
Después hay que conseguir un script de inicio/parada:
Debian ya no instala un script de inicio pero puedes usar el viejo si quieres
gunzip /usr/share/doc/iptables/examples/oldinitdscript.gz -c > /etc/init.d/iptables
 
Tambien puedes copiar el script que viene en Knoppix.
 

Otro modo -rápido- de montarlo

Como root

  1. # mkdir /etc/iptables

  2. # cd /etc/iptables
  3. (descargar y descomprimir mis ficheros iptables en este directorio)
  4. # chmod u+x *
  5. # mv iptables /etc/init.d
  6. # ./ipflush.sh
  7. # iptables-save > iptables.flush
  8. # vi iprules.sh (ajustar al gusto)
  9. # ./iprules.sh
  10. # iptables-save > iptables.rc

Para “parar” iptables:# /etc/init.d/iptables stop
Para activar iptables:# /etc/init.d/iptables start
Para modificar las reglas: repetir pasos 8 a 10.
 

Alternativa por interfaces

Cada vez que se levanta una if, se ejecutan por orden alfabetico todos los scripts de /etc/network/if-up.d/
Si queremos ejecutar scripts solo cuando un if se levanta / baja hay que usar /etc/network/interfaces. Por ejemplo:

iface eth0 inet dhcp
    pre-up /sbin/iptables-restore < /etc/iptables/eth0_rules
    post-down /sbin/iptables-restore < /etc/iptables/eth0_flush

(man interfaces)
 

Iptables en GNU/Linux, Guía rápida de Iptables en Linux

Comandos útiles en GNU/Linux

Este artículo está dedicado a pequeños comandos, a veces desconocidos o medio olvidados, que no necesitan una receta a parte.

 
# lsb_release -a

Muestra información sobre la distribución.

No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 4.0r1 (etch)
Release:        4.0r1
Codename:       etch

 

  • dmesg : Imprime los mensajes desplegados por el “kernel” al inicio.
  • dmidecode: Este comando proporciona información sobre el hardware, incluyendo número y tipo de módulos de memoria, marca y modelo de la placa base, capacidades de la BIOS… (p.e. dmidecode –type memory, –type baseboard, –type BIOS…)
  • depmod -a : Genera un archivo que contiene las dependencias de los módulos que son cargados para el “Kernel”,esto es, es capaz de reconocer cuales módulos deben de ser cargados para que un tercero sea utilizado en el sistema.
  • free : Estadísticas de uso de Memoria.
  • init q : Comando que vuelve a leer los parámetros que se encuentran en inittab.
  • insmod : Habilita (“loads”) el modulo que se especifica en la linea, para que el “kernel” sea capaz de utilizarlo.(ejemplo: insmod ip_alias.o )
  • ldconfig : Actualiza las librerías utilizadas por el sistema, recomendable ejecutarlo cada vez que se instale un programa.
  • lsmod : Despliega la información referente a los módulos que están habilitados por el “kernel”.
  • mount Permite que particiones del sistemas,CD-ROMs, floppys puedan ser leídas en el sistema. Su formato: mount -t <file system(ext2,vfat)> <partición (/dev/hda1,/dev/cdrom)> <punto de lecutra"mount point" (/mnt/home/ /mnt/cdrom)>.
  • smbmount :Similar al comando mount , excepto que este comando es utilizado para montar particiones en Samba.
  • smbumount : Utilizado para desactivar las particiones activadas con smbmount
  • slocate : Actualiza la base de información que es utilizada
    para encontrar archivos con el comando locate .
  • source : Recarga el archivo de configuración indicado al ambiente de Shell .
  • stat : Despliega información detallada sobre el archivo especificado como: fechas de modificación y cambio, dueño del archivo..etc.
  • sudo : Ejecuta un comando como usario raiz (“root”), significa “super user do”(Super usuario hacer).
  • umount : Desactiva la partición que se indicada, los parámetros que toma este comando son similares a los de mount .
  • uname -a : Información completa sobre el “Host”.
  • uptime : Hora actual, tiempo que lleva el sistema corriendo desde el
    ultimo “reboot”, usuarios conectados al servidor, carga del sistema en los últimos 1,5 y 15 minutos.
  • hostname : El nombre del “Host”.
  • chkconfig : Este comando despliega la información sobre los niveles de ejecución de los “scripts” ubicados en el directorio /etc/rc.d/init.d.

Extraer pistas de sonido de DVD

(Basado en un artículo de togaware y actualizado).

Para extraer pistas de sonido de un DVD, primero hemos de conocer su contenido.
Para ello hacemos:
(Asumimos que el dvd está en /dev/dvd -generalmente mediante un enlace-):
$ lsdvd

  libdvdread: Using libdvdcss version 1.2.10 for DVD access
  Title: 01, Length: 02:32:44 Chapters: 26, Cells: 27, Audio streams: 02, Subpictures: 01
  Title: 02, Length: 00:17:36 Chapters: 02, Cells: 02, Audio streams: 01, Subpictures: 00
  Title: 03, Length: 00:00:11 Chapters: 02, Cells: 02, Audio streams: 01, Subpictures: 00

  Longest track: 01

 
Este DVD tiene tres títulos, siendo el primero (01) el más largo, que probablemente contiene el material principal.
Nos fijamos en que ese título 01 tiene 26 capítulos y 2 pistas de audio.

Para extraer el sonido utilizamos:
$ transcode -i /dev/dvd -x dvd,dvd -T 1,2,1 -a 0 -y null,tcaud -m 02.mp3

 
Con esto le pedimos a transcode que lea en /dev/dvd (-i), que el tipo de medio utilizado es DVD (-x), que el objetivo es el título 1, capítulo 2, ángulo 1 (-T), que la pista de sonido a extraer es la primera (-a 0) que extraiga el audio sin recodificarlo (-y) y que escriba el fichero 02.mp3 (-m).

Para extraer varios capítulos podemos hacer:
$ for i in 1 2 3 4 5; do
> transcode -i /dev/dvd -x dvd,dvd -T 1,$i,1 -a 0 -y null,tcaud -m 0$i.mp3;
> done

 

Compilar núcleo a la manera Debian

Comprobamos las versiones de los paquetes necesarios instalados con el script kverif.sh.

# Preparacion

sudo aptitude install linux-source-2.6
sudo aptitude install kernel-package
sudo aptitude install libncurses5-dev
mkdir ~/source
cd ~/source

# Descomprimimos las fuentes

tar xjf /usr/src/linux-source-2.6.17.tar.bz2
cd linux-source-2.6.17/

# Configuramos el kernel

make menuconfig

# Limpiamos el árbol de fuentes y reiniciamos los parámetros de kernel-package

make-kpkg clean

# Compilamos el kernel y generamos el paquete .deb

fakeroot /usr/bin/make-kpkg --revision=custom.1.0 kernel_image

# Instalamos el paquete creado

cd ..
sudo dpkg -i linux-image-2.6.17_custom.1.0_i386.deb

 

Gestión de RAID por software en GNU/Linux

INSTALACION DE RAID

Lo preferible es generar el RAID al realizar la instalación del sistema utilizando sus asistentes.
Podemos añadir RAID a una instalación ya funcional, para ello configuraremos RAID 1 (espejo o mirror) siguiendo la estupenda guía de philcore. Indico a continuación los pasos dados. Por tanto lo que sigue es básicamente una traducción resumida.
 
Tenemos en /dev/sda nuestro sistema básico instalado y queremos utilizar /dev/sdb como disco espejo.
Instalamos las herramientas de RAID:
# aptitude install mdadm

 
Desmontamos todas las particiones excepto “/” y swap.
Utilizamos fdisk para cambiar los tipos de las particiones a “fd” (raid autodetect). No hay que cambiar la partición swap.
Veremos un error al escribir la nueva tabla por estar el sistema en uso, pero no pasa nada.
Verificamos
# fdisk -l /dev/sda

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        3647    29294496   fd  Linux raid autodetect
/dev/sda2            3648        7294    29294527+  fd  Linux raid autodetect
/dev/sda3            7295        7622     2634660   82  Linux swap / Solaris
/dev/sda4            7623       19457    95064637+   5  Extended
/dev/sda5            7623       12292    37511743+  fd  Linux raid autodetect
/dev/sda6           12293       19457    57552831   fd  Linux raid autodetect

 
Usamos sfdisk para copiar la tabla de particiones en /dev/sdb:
# sfdisk -d /dev/sda | sfdisk /dev/sdb

 
Creamos los volúmenes RAID indicando que se componen de dos dispositivos. El primero está perdido (no queremos aún que utilice las particiones donde hemos instalado) y el segundo está en /dev/sdb:

# mdadm –create /dev/md0 –level 1 –raid-devices=2 missing /dev/sdb1

# mdadm –create /dev/md1 –level 1 –raid-devices=2 missing /dev/sdb2
# mdadm –create /dev/md2 –level 1 –raid-devices=2 missing /dev/sdb4

# mdadm –create /dev/md3 –level 1 –raid-devices=2 missing /dev/sdb5

 
Creamos sistemas de fichero en los volúmenes RAID:

# mkfs.ext3 /dev/md0
# mkfs.ext3 /dev/md1
# mkfs.ext3 /dev/md2

# mkfs.ext3 /dev/md3

 
Montamos el volumen que contendrá el sistema y copiamos la raiz:

# mount /dev/md0 /mnt
# cp -dpRx / /mnt

 
Montamos y copiamos el resto de volúmenes:

# mount /dev/md1 /mnt/copia
# cp -dpRx /copia /mnt/copia

# mount /dev/md2 /mnt/home
# cp -dpRx /home/personal /mnt/home/personal

# mount /dev/md3 /mnt/home/trabajo
# cp -dpRx /home/trabajo /mnt/home/trabajo


 
Editamos /etc/fstab:

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>	   <dump>  <pass> 
proc            /proc           proc    defaults        0       0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

/dev/md0       /               ext3    defaults,errors=remount-ro 0       1
/dev/md1       /copia          ext3    defaults        0       2
/dev/md2       /home/personal  ext3    nodev,nosuid,noexec,usrquota,grpquota 0       2
/dev/md3       /home/trabajo   ext3    nodev,nosuid,noexec,usrquota,grpquota 0       2

/dev/sda3       none            swap    sw,pri=1        0       0
/dev/sdb3       none            swap    sw,pri=1        0       0

Como se ve hemos preparado md2 y md3 para utilizar cuotas y se han configurado por seguridad para que en esos sistemas de ficheros no se utilicen dispositivos (nodev), ficheros con setuid (nosuid) ni ficheros ejecutables (noexec).
 
Editamos /boot/grub/menu.lst. Opcionalmente podemos activar framebuffer:

(...)
title           Debian GNU/Linux, kernel 2.6.18-3-686
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-3-686 root=/dev/md0 md=0,/dev/sda1,/dev/sdb1 ro vga=791
initrd          /boot/initrd.img-2.6.18-3-686
savedefault

title           Debian GNU/Linux, kernel 2.6.18-3-686 (RAID recovery disc-A)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-3-686 root=/dev/md0 md=0,/dev/sda1 ro single
initrd          /boot/initrd.img-2.6.18-3-686
savedefault

title           Debian GNU/Linux, kernel 2.6.18-3-686 (RAID recovery disc-B)
root            (hd1,0)
kernel          /boot/vmlinuz-2.6.18-3-686 root=/dev/md0 md=0,/dev/sdb1 ro single
initrd          /boot/initrd.img-2.6.18-3-686
savedefault
(...)

 
Copiamos los ficheros editados al disco espejo:

# cp -dp /etc/fstab /mnt/etc/fstab
# cp -dp /boot/grub/menu.lst /mnt/boot/grub

 
Instalamos grub en el segundo disco, para que podamos arrancar si falla el primero:

# grub-install /dev/sda
# grub

grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)
grub> quit

 

Y por fin reiniciamos el sistema para utilizar ya los volúmenes RAID y verificar que todo va bien.
# shutdown -r now

 

El sistema debería rearrancar correctamente. Algunas verificaciones que podemos hacer:

# mount
# df
# mdadm -QD /dev/md0
# mdadm -QD /dev/md1
# mdadm -QD /dev/md2
# mdadm -QD /dev/md3
# cat /proc/mdstat

 

Añadimos las particiones de /dev/sda (que no estamos usando) a los volúmenes RAID:

# mdadm –add /dev/md0 /dev/sda1
# mdadm –add /dev/md1 /dev/sda2


 
Cada vez que añadimos una partición a un volumen RAID debe sincronizarla. Si se intenta añadir una partición antes de que termine de sincronizar la anterior el sistema nos dará un aviso y encolará la tarea.
No reiniciar hasta que las particiones esten sincronizadas.
Podemos verlo en /proc/mdstat. Cuando indica [UU] es que está correcto.
# cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda5[0] sdb5[1]
      37511616 blocks [2/2] [UU]

md3 : active raid1 sda6[0] sdb6[1]
      57552704 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      29294400 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      29294400 blocks [2/2] [UU]

unused devices: <none>

VERIFICACIONES


# mount
# df
# mdadm -QD /dev/md0
# mdadm -QD /dev/md1
# mdadm -QD /dev/md2
# mdadm -QD /dev/md3
# cat /proc/mdstat

 

ELIMINAR VOLÚMENES Y PARTICIONES

Si se desea quitar una partición de un volumen:

# mdadm –fail /dev/md2 /dev/sda4
# mdadm –remove /dev/md2 /dev/sda4

No se pueden quitar todas las particiones de un volumen. Si lo que se desea es eliminar el volumen:
# mdadm –stop /dev/md2

Nada de esto afecta al estado de las partiones en sí mismas.

ERROR DE MDADM AL ACTUALIZAR EL KERNEL

Al actualizar automáticamente el kernel del sistema, por ejemplo con un aptitude dist-upgrade, nos genera un nuevo fichero “/boot/grub/menu.lst” que no está preparado para el RAID, con lo que el sistema no arranca.
Para prevenir el error, tras actualizar el kernel y antes de reiniciar hay que modificar “/boot/grub/menu.lst” para dejarlo como se muestra más arriba.
Si reiniciamos y no detecta los discos duros porque no hemos modificado “/boot/grub/menu.lst“, podemos modificarlo en el arranque desde el propio GRUB. Para ello cuando nos muestra las opciones de arranque seleccionamos la que nos interesa y pulsamos ‘e’ (editar), así dispondremos de un editor sencillo para modificar los parámetros del arranque.
Nos desplazamos con las flechas del cursor a la linea “kernel” y volvemos a pulsar ‘e’ para editarla.
Cambiamos root=/dev/sda1 por root=/dev/md0 md=0,/dev/sda1,/dev/sdb1 y pulsamos ‘b’ (boot) para arrancar.
Una vez arrancado el sistema modificamos “/boot/grub/menu.lst“.
 

Introducción a bash

El texto original es de IvanYuja. Posteriormente ha sido modificado y ampliado.

Linux presenta una interfaz de línea de comandos, llamado consola o shell, la cual permite al usuario interactuar con el sistema operativo de una forma amigable.

Algunos ejemplos de estas consolas son: bash, csh, ksh, sh, entre otros. En este texto se utilizará BASH.

BASH (acrónimo de Bourne-Again Shell) es un intérprete de comandos compatible con sh, puede leer comandos desde la entrada estándar (standar input) o de un archivo.

Una salida típica de un shell de usuario puede verse así:

~ $ _

si la salida contiene un signo de almoadilla (#), en lugar del signo de dólar, quiere decir que esta loggeado como root.

~ # _

Cuadro I: Keystrokes para editar en la línea de comandos

Teclas Descripción
Ctrl-a Mueve el cursor al inicio de la línea de entrada
Ctrl-b Mueve el cursor un espacio hacia adelante
Ctrl-f Mueve el cursor un espacio hacia atrás
Ctrl-d Borra la letra que esta inmediatamente despúes del cursor
Ctrl-e Mueve el cursor al final de la línea de entrada
Ctrl-k Corta caracteres desde la posición del cursor hasta el final de la línea
Ctrl-n Se desplaza en el histórico de comandos hacia adelante
Ctrl-p Se desplaza en el histórico de comandos hacia atrás
Ctrl-q Des-bloquea la terminal
Ctrl-r Búsqueda de comandos en el histórico
Ctrl-s Bloquea la terminal
Ctrl-t Swap entre letras. Eje: ‘jeo’ lo convierte en ‘joe’ si el cursor esta encima de la ‘o’ al momento de corregir
Ctrl-l Limpia la terminal (equivalente a clear)
Ctrl-u Corta toda la línea de entrada
Ctrl-w Borra la palabra que está antes del cursor
Ctrl-y Pega el texto que fue cortado, a partir de la posición del cursor
Tab Completa comandos o rutas, según existan
Tab-Tab Muestra opciones que cumplen con el inicio de un patrón

a. Completando comandos:

$ ls /bin/m[tab][tab]
mkdir mkfifo mknod more mount mv 

$ ls /bin/mor[tab]
$ ls /bin/more

b. Repitiendo el último comando que se digitó:

$ [UP]

c. Utilizando el historial:
El comando history mostará un historial ennumerado de los últimos comandos digitados.

$ history
 1 cd /home/
 2 cd /mnt/cdrom/
 3 ls
 4 history

para hacer uso de alguno de los comandos digitados, es posible llamarlos utilizando el signo de admiración (!) seguido del número del comando digitado en el historial, por ejemplo:

$ !3
ls
arch* domainname@  ln* sed* awk@ du* loadkeys* setterm* bash* echo* login* sh@ bunzip2@ ed* ls* shred*

d. Ejecutando una lista de comandos:

Para ejectuar más de un comando en la línea de entrada, solamente digite cada comando en orden separando cada comandos con un punto y coma (;). Por ejemplo para limpiar la consola y luego desloggearse del systema puede hacer:

$ clear; logout

e. Redireccionado la entrada y salida:
Utilice el operador ‘>’ para redireccionar la salida estándar de un comando a un archivo al cual se va a escribir la salida, y el operador ‘>>’ para anexar la salida a un archivo (el archivo puede existir, o no).
Por ejemplo:

$ ls > /tmp/contenido.de.bin

f. Mostrando el contenido de un archivo:
hay herramientas para ver el contenido de un archivo de texto entre ellas las más comunes son: less, more, most y cat, aunque el comando cat tiene más funcionalidad que solamente mostrar el contenido de un archivo.

Del ejemplo anterior:

$ cat /tmp/contenido.de.bin
arch*
awk@
bash*
bunzip2@
bzcat@
bzip2*
...

o bien se puede direccionar la entrada de cat del archivo contenido.de.bin, de la siguiente forma:

$ cat < /tmp/contenido.de.bin
arch*
awk@
bash*
bunzip2@
bzcat@
bzip2*
...

g. Redireccionando mensajes de error a un archivo: para redireccionar la salida error estándar utilice el operador ‘>’ precedido de ’2′ (2 representa al archivo de error estándar) luego el archivo al cual se va a escribir el error:

$ ls archivo-que-no-existe 2 > command.error

para redireccionar la salida estándar y el error estándar a un mismo archivo haga:

$ ls archivo-que-no-existe &> command.error

por ejemplo, si se quisiera redireccionar la salída estándar a la salida de error estándar se puede hacer lo siguiente:

$ (ls /bin/ 1>&2)>a.txt
arch*
awk@
bash*
bunzip2@
bzcat@
bzip2*
... 

$ cat a.txt

observará que a.txt no contiene ningún dato, ya que la redirección ‘> a.txt’ recibe la salida estándar, la cual está siendo redireccionada al error estándar, por tanto a.txt se encuentra vacío.

h. El background y foreground: usted puede ejecutar comandos sin que estos bloqueen la línea de comandos en su ejeccución, a esto se le llama background y regresarlos a la salida en la línea de comandos (foreground). Para ejecutar un comando en background solamente tiene que añadir el operador ‘&’ al final del comando:

$ ls /bin/ > contenido.de.bin &
[1] 683
[1] Done     ls /bin/ >contenido.de.bin

donde 1 es el número de proceso siendo ejecutado en la shell que se utiliza y 683 es el identificador del proceso, asignado por el kernel. La última línea le informa cuando el comando finalizó su ejeccución.

Ahora bien, si yo estoy utilizando alguna aplicacion y la quiero detener para poder ejectuar otro comando, utilizo el keystroke

Ctrl-z

y para ver la lista de procesos que están siendo ejecutados bajo esa shell:

$ jobs
[1]+ Stopped vi

de nuevo el 1 me va a mostrar el número de proceso para dicha shell y ‘Stopped’ me dice, que el comando esta detenido de ejecución en ese momento, si quiero seguir ejecutando ese proceso en el background, se utiliza el comando bg, seguido por el numero de proceso del shell. En nuestro caso (aunque no tenga mucho sentido ejecutar un editor en background) se utiliza:

$ bg %1
[1]- vi &

para regresar un comando proceso al foreground se utiliza el comando fg, seguido por el número de proceso para la terminal. Por ejemplo:

$ fg %1

para ‘matar’ algún proceso que esté en bg puedo utilizar el comando kill seguido por el número del proceso para la shell. Ejemplo:

$ kill %1
[1]+ Stopped vi

i. Tubería entre aplicaciones: la carácterística principal de la shell de Linux (y sistemas parecido- UNIX) es que no existen programas monolíticos para algo complejo, sin embargo la shell ofrece comandos de fin sencillo pero que uniéndolos hacen un proceso bastante complejo. Para comunicar programas entre sí, se utiliza el operador ‘|’ (pipe), esto lo que hace es comunicar la salida estándar de un comando con la entrada estándar de otro comando, por ejemplo, si quisiéramos contar la cantidad de archivos en el directorio /dev, podemos utilizar:

$ ls /dev/ | wc -l
2561

donde el comando `wc -l’ lo que hace es contar la cantidad de líneas que recibe de una entrada estándar, en este caso el resultado de ls dev.

j. Prioridad de los procesos:
Lo más común es tener muchos procesos a la vez ejecutándose en nuestra máquina.
Pero no todos son igual de importantes.
La forma de establecer prioridades es ejecutando desde el principio el comando interesado
mediante nice, o bien, conseguir su PID si ya se está ejecutando
y usar renice para cambiar su prioridad.

Algunos ejemplos:

$ nice -n PRIORIDAD COMANDO
$ renice PRIORIDAD PID_PROCESO

PRIORIDAD es un valor que va desde -20 a +20 (con el signo incluido). -20 es la prioridad más alta (al contrario de lo que cabría pensar), y +20 la más baja. Sólo root puede establecer un proceso a una prioridad negativa, los usuarios como máximo pueden poner un proceso en prioridad 0.

Introducción a bash, shell, línea de comandos, prompt

Claves GPG con apt-key

Si al hacer apt-get update aparece el siguiente mensaje:
The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 010908312D230C5F
El sistema no está indicando que necesitamos una nueva llave para poder actualizar los paquetes.
De la clave (números y letras tras ‘NO_PUBKEY’) tomamos los 8 últimos caracteres, en el ejemplo: ’2D230C5F’, e indicamos a gpg que nos baje del servidor de llaves de Debian esa clave:
#gpg –keyserver keyring.debian.org –recv-key 2D230C5F

    gpg: requesting key 2D230C5F from hkp server keyring.debian.org
    gpg: key 2D230C5F: "Debian Archive Automatic Signing Key (2006) < ftpmaster@debian.org>" not changed
    gpg: Total number processed: 1
    gpg:              unchanged: 1

Después exportamos la nueva clave de gpg y la añadimos en apt-key con el siguiente comando:
gpg –armor –export 2D230C5F | apt-key add -

    gpg: no ultimately trusted keys found
    OK

Por último podemos comprobar que la nueva clave es válida:
# apt-key list

    /etc/apt/trusted.gpg
    --------------------
    pub   1024D/4F368D5D 2005-01-31 [expires: 2006-01-31]
    uid                  Debian Archive Automatic Signing Key (2005) <ftpmaster@debian.org >

    pub   1024D/2D230C5F 2006-01-03 [expires: 2007-02-07]
    uid                  Debian Archive Automatic Signing Key (2006) <ftpmaster@debian.org>

Ya podemos volver a hacer apt-get update.