Showing posts with label Consola. Show all posts
Showing posts with label Consola. Show all posts

11/27/2009


Monitorear el sistema en Gnu/Linux desde consola

En este post quiero hacer una recompilación de scripts y comandos para monitorear nuestro sistema desde la consola de una manera agradable, es decir darle un toque de color :).

Visualizar netstat:

Empecemos con el monitoreo a través de la herramiento netstat, muy conocida por su multiplataforma para ver las conexiones entrantes y salientes. Bueno a continuación les dejo un script encontrado en la web y modificado para esta versión de Ubuntu 9.10 que uso en español.


#!/bin/bash
cyan="\E[1;36m\E[1m";
normal="\E[m";
blue="\E[34m\E[1m";
violet="\E[35m\E[1m";
red="\E[31m\E[1m";
yellow="\E[33m\E[1m";
green="\E[37m\E[32m\E[1m";
text="\E[1;37m\E[1m";

if [ "$UID" != "0" ]; then
echo -e "$red$0: You will get more information if you have root privileges. Try sudo $0$normal"
fi

netstat -natp | \
while read line; do

if [ `echo $line | awk '{print($1)}'` = "Proto" ]; then
echo -e "$yellow=====================================================================================================$normal"
echo -e "$text$line$normal"
echo -e "$yellow=====================================================================================================$normal"
else

state=`echo $line | awk '{print($6)}'`
color=$yellow
case $state in
"ESTABLECIDO")
color=$green;;
"SYN_SENT" | "SYN_RECV")
color=$yellow;;
"FIN_WAIT1" | "FIN_WAIT2" |"TIME_WAIT")
color=$violet;;
"CLOSE" | "CLOSE_WAIT" | "LAST_ACK" | "CLOSING" )
color=$blue;;
"ESCUCHAR")
color=$red;;
"UNKNOWN")
color=$red;;
*)
esac
echo -e "$color$line$normal"

fi
done;
Para usar el script:
touch nett
/*Creamos el fichero*/
chmod +x nett
/*Le damos permiso de ejecucion*/
gedit nett
/*Abrimos Gedit y pegamos el codigo y ponemos guardar */
./nett
/*Para usarlo*/

Visualizar logs:

Primero instalamos el paquete ccze que nos colorizará nuestra terminal con los resultados de los logs.
apt-get install ccze

Generalmente visualizamos los logs en los ficheros que se encuentran en /var/log/.

La herramienta TAIL permite visualizar ciertas líneas de un archivo de texto plano, por ejemplo las últimas X líneas, pero la opción que utilizaremos se queda esperando cambios en el archivo y los muestra a medida que van apareciendo. En el caso de visualizar un archivo de log tendremos la actualización constante del archivo en nuestra pantalla:

# tail -f /var/log/syslog

Ahora solo queda mejorar un poco la salida para que sea mas ágil la lectura:

# tail -f /var/log/syslog | ccze

A continuación veremos la salida de dmesg:

# tail -f /var/log/dmesg | ccze

También se pueden monitorear tres logs al mismo tiempo, aunque no es muy recomendable nos dará una mirada al instante de lo que ocurre en nuestro sistema:

# tail -f /var/log/syslog /var/log/auth.log /var/log/dmesg | ccze


Pueden crear alias en el archivo $HOME/.bashrc para ahorrarse el comando en conjunto :

...
alias syslog='tail -f /var/log/syslog | ccze'
alias maillog='tail -f /var/log/mail.log | ccze'
alias weblog='tail -f /var/log/squid/access.log | ccze'
...

Luego solamente tipeando:

$ syslog

Veremos la salida de /var/log/syslog coloreada.

Espero que les resulte útil. Saludos :)

Fuente y Relacionados:
Logs en Gnu/Linux
Logs en Tiempo Real
Colorear Logs

11/04/2008


Programación en Bash

Exelente manual para la programación en bash, desde xtech.com.ar

Introducción

Linux, así como la mayoría de los UNIX, utilizan shell scripts para realizar una infinidad de tareas. Un shell script es un programa que se escribe con una sintaxis particular, en un archivo de texto plano, para que sea interpretado por un shell, en este caso /bin/bash.

Un shell script es básicamente un programa que llama a otros programas, con la posibilidad de hacer algun tipo de procesamiento propio (como control de flujo, operaciones matemáticas simples, etc).

Por lo tanto la forma de crear un shell script es hacer un archivo con nuestro ya querido vi:

vi holam

Luego lo llenamos con las instrucciones que deseamos. Por ejemplo:

#!/bin/bash
echo "Hola mundo!"
# Esto es por costumbre utilizado como ejemplo del primer programa.
# Se dice que trae suerte!

Luego le damos permisos de ejecución a ese archivo:

chmod +x holam

Y de esta manera ya tendremos listo un shell script que se ejecuta de la siguiente forma:

./holam

Debemos destacar la primera linea de nuestro script bash:

 #!/bin/bash

esta línea le indica al sistema que el script será interpretado por el programa que se encuentra a continuación de #!, en este caso, /bin/bash

Las últimas dos líneas son comentarios

 # Esto es por costumbre utilizado como ejemplo del primer programa.
# Se dice que trae suerte!

Los comentarios comienzan con # y se extienden hasta el final de la línea. Es muy útil ir comentando el código que uno escribe, para recordar qué realizan ciertas funciones o algoritmos, y otra persona pueda comprender el funcionamiento de nuestro script.


Variables

Las variables en un script BASH son simplemente identificadores, sin tipo. Para asignar un valor a una variable, se utiliza el operador =, por ejemplo:

[jose@xtech experto]$ MIVARIABLE=4

Por convención, los nombres de las variables se usan en mayúsculas, aunque no es obligatorio.

Para usar el contenido de la variable, dentro de un script, se usa el operador $. Por ejemplo:

[jose@xtech experto]$ echo $MIVARIABLE
4
[jose@xtech experto]$

Para utilizar el contenido de una variable, seguida de un texto, debemos usar las llaves {}

Consideremos este ejemplo:

 ARCHIVO="/tmp/ej"
mv $ARCHIVO $ARCHIVO-bak

En este caso, bash interpretaría a $ARCHIVO y $ARCHIVO-bak como dos variables distintas, para evitar esto debemos reescribirlo de esta manera:

 ARCHIVO="/tmp/ej"
mv $ARCHIVO ${ARCHIVO}-bak

Comillas

En el shell, el espacio, o el tab, son separadores. Es decir, que cuando al shell le indicamos

ls -l hola que tal

Lo interpreta como que le pedimos que nos de información sobre tres archivos, llamados: hola, que, y tal.

Si en realidad, lo que queríamos, era información sobre un archivo llamado "hola que tal", entonces hay varias maneras de indicarle al shell que los espacios entre esas palabras no deben ser separadores.

Escape ( \ )

Hay un caracter de escape, que indica al shell que el siguiente carácter no es especial. Y es la barra invertida. Por lo tanto, podríamos obtener la información del archivo "hola que tal" de la siguiente forma:

ls -l hola\ que\ tal

Los espacios no son especiales, no son separadores, y "hola que tal" es una sola palabra.

Algunos caracteres especiales más:

\ @ ! | < > [ ] { } ( ) ? * $ ' ^ ` " # & ;

Por lo tanto, si queremos incluir la \ en alguna parte, entonces debemos ponerla 2 veces (\\), la primera para decirle a BASH que no tome como carácter especial lo que sigue y la segunda como ese carácter que queremos incluír. Esto es muy común en casos como:

cd algún\ directorio\ con\ espacios

Comillas dobles ( " " )

Las comillas dobles hacen que los espacios entre las comillas no sean especiales. Por lo tanto, podríamos haber utilizado:

ls -l "hola que tal"

Todos los otros carácteres siguen siendo especiales.

Comillas simples ( ' ' )

Las comillas simples logran que ningún caracter (salvo la comilla simple misma) sea especial. Por ejemplo, si quisieramos crear un archivo que se llame *@$&, lo debemos hacer rodeándolo de comillas simples:

touch '*@$&'

Si queremos poner una comilla simple, debemos "escaparla". Para crear un archivo llamado que'tal, deberíamos hacerlo así:

touch 'que\'tal'

Ya que si no lo hacemos, la segunda comilla "cierra" la primera!

Comilla invertida ( ` ` )

Las comillas invertidas son más raras. Deben rodear un comando. Ese comando será ejecutado, y lo que ese comando imprima reemplazará al contenido de las comillas invertidas. Tal vez lo más sencillo sea un ejemplo:

[jose@xtech experto]$ ls
experto.aux experto.log experto.lyx experto.pdf experto.tex
experto.dvi #experto.lyx# experto.lyx~ experto.ps experto.toc

[jose@xtech experto]$ V=`ls`
[jose@xtech experto]$ echo $V
experto.aux experto.log experto.lyx experto.pdf experto.tex
experto.dvi #experto.lyx# experto.lyx~ experto.ps experto.toc
[jose@xtech experto]$

El uso más frecuente de las comillas invertidas es poder asignar el "resultado" de un comando a una variable.

Control de flujo

Esto refiere al cauce o flujo normal de los programas. No siempre hay un solo camino a seguir y estas proposiciones permiten que el programa realice distintas tareas, según las condiciones de las variables a interpretar.

"if"

El"if" es un proposición de control que verifica si es verdadera o falsa una condición.

Sintaxis:

if comando-condición
then
Comandos si la condición es verdadera
else
Comandos si la condición es falsa
fi

Es importante que la ubicación de las lineas se mantenga, ya que las proposiciones if/then/else/fi se controlan línea por línea. La parte else es opcional. En caso de querer hacer todo el control en una sola línea, las proposiciones deberán estar separadas por un punto y coma (;).

Los comandos que estén debajo del then se ejecutarán si la condición dio verdadera. Esto quiere decir que el valor de retorno de la condición fue 0 (cero). En caso contrario se ejecutarán los comandos que le siguen al else, si es que se utilizó esta proposición.

En la condición se puede poner un comando, donde la ejecución del mismo (su valor de retorno) definirá qué comandos (de qué proposición) se ejecutarán.

Si se verifica una condición, se deberán utilizar los corchetes para mayor comprensión.

Ejemplos:

(utilizando comandos) El hecho de entregar algo como salida se toma como condición lógica verdadera.

if ps ax | grep httpd | grep -v grep
then
echo "El web server está funcionando"
else
echo "El web server NO esta funcionando"
fi

(utilizando condiciones)

if [ -w /etc/passwd ]
then
echo "Tengo permisos de escritura en el archivo /etc/passwd"
else
echo "NO tengo permisos de escritura en el archivo /etc/passwd"
fi

Puede suceder que tengamos que testear mas de una condicion, para esto, podemos utilizar la siguiente estructura:

if condición1
then
Comando1
Comando2
elif condición2
then
Comando1
Comando2
else
Comando-por-defecto #Ninguna de las condiciones anteriores es verdadera
fi

Esta es una manera de abreviar varias estructuras if - then - else - if en una sola, pudiendo utilizarse más de dos condiciones.

La estructura de control if, es muy utilizada con test, que no es más que una operación de comparación, en las condiciones que se requieran.

"case"

El "case" es una proposición que puede analizar y validar varios casos (opciones) del valor de una variable.

Sintaxis

case variable in
patrón | patrón)
Comando;
Comando;
Comando;;

patrón | patrón)
Comando;
Comando;
Comando;;
*)
Comandos si ningún otro valor fue igualado;;
esac

El case es raramente usado, pero es muy eficiente en algunos casos.

Ejemplos:

case $mes in
ene*|Ene*)
echo "Mes de Enero";;
feb*|Feb*)
echo "Mes de Febrero";;
mar*|Mar*)
echo "Mes de Marzo";;
*)
echo "Algún otro mes!";;
esac

Ciclos

Los ciclos contienen secciones del programa que se repetirán una determinada cantidad de veces o hasta que alguna condición cambie.

for

El for debe ser el ciclo más utilizado, es muy práctico cuando se trabaja con shell scripts.

A diferencia de los lenguajes de programación más comunes, un ciclo for dentro de un shell script realiza una acción dada sobre cada uno de los elementos de una lista, y no sobre una variable que se va incrementando en cada ciclo.

La variable utilizada en el for (en este caso $i) es reemplazada por cada una de las palabras de la lista, en cada ciclo del for.

Sintaxis:

for i in lista de palabras
do
cuerpo del ciclo, $i tiene el valor de elementos sucesivos de la lista
done

Ejemplos:

for i in `ls -1 /tmp`
do
echo $i
rm -i $i
done

En este ciclo, el comando ls -1 /tmp, generará una lista de todos los archivos que existen en el directorio /tmp. Dentro del cuerpo del ciclo imprimimos el contenido de la variable y luego preguntamos si se desea borrar ese archivo (opción -i del comando rm).

while

Este ciclo utiliza la condición de terminación de un comando (valor de retorno) para controlar la ejecución de los comando dentro del ciclo. Termina la ejecución del ciclo, cuando el comando devuelve falso (algo diferente a 0).

Sintaxis:

while comando
do
cuerpo del ciclo ejecutado a condición de
que el comando devuelva verdadero
done

Ejemplos:

while sleep 60
do
who | grep daniel
done

En este ejemplo, cada 60 segundos (definidos por el comando sleep 60), verificará si el usuario daniel ha ingresado al equipo. En caso de que lo haya hecho, el listado del who saldrá por pantalla (cada 60 segundos).

until

Este ciclo se comporta de una manera muy similar al anterior, ya que define su control dependiendo del comando que ejecuta (si éste da verdadero, se sigue ejecutando el ciclo).

Sintaxis:

until comando
do
cuerpo del ciclo ejecutado a condición
de que el comando devuelva falso.
done

Ejemplo:

until who | grep daniel
do
sleep 60
done

En este ejemplo, a diferencia del ejemplo del ciclo while, el ciclo ejecuta primero el comando, de esta forma no es necesario esperar 60 segundos para saber si el usuario daniel esta logueado en el equipo (si el usuario esta logueado, el ciclo termina).

Argumentos

Los argumentos sirven para pasarle a un programa o una función valores desde la línea de comando.

Variable Descripción
$# Número de argumentos
$* Todos los argumentos del shell
$- Opciones suministradas al shell
$? Valor de retorno del último comando ejecutado
$$ Identificación del PID (número de proceso)
$0 Nombre del script
$1 Primer argumento
$n Argumento "n"

Ejemplo:

#!/bin/sh
#
# Programa que recibe argumentos y los imprime por pantalla
#
echo "\$*: $*"
echo "\$#: $#"
echo "\$0: $0"
echo "\$1: $1"
echo "\$2: $2"

Notas sobre el ejemplo:

En la líneas de impresión (echo), para imprimir el símbolo "$" (pesos) se tiene que anteponer el símbolo "\" (contra barra), sino el shell lo va a interpretar como una variable, y si esta existe imprimirá su contenido.

Funciones

Las funciones son un recurso esencial para la buena programación, permiten escribir una sola vez un pedazo de código que se repita varias veces en el script, y así, minimizar el margen de error y también la cantidad de líneas en el programa.

Para utilizarlas simplemente se hace un llamado a la función. Las funciones pueden estar dentro del mismo shell script, o en un archivo aparte. Cuando se escriben las funciones en un archivo aparte, es muy importante utilizar el comando "." (punto) para cargarlas en memoria. Si no se cargan en memoria de esta manera, las funciones no estarán disponibles.

Ejemplo:

#
# Cargando las funciones en memoria
#
. /home/jose/funciones/funciones-arch.sh

Uso

La sintaxis para utilizar funciones es muy sencilla y no agrega mayor dificultad. El modo de uso se remite a definir la función especificando el nombre y parentesis que abren y cierran. Todos los comandos que involucran la función se encierran con llaves.

Ejemplo:

(archivo: lib/arch.sh)

#
# Funciones para manipulación de archivos
#
borrar ()
{
arch=$1
if [ -z "$arch" ]
then
echo "No se recibió ningún archivo"
return 2
else
if [ -f "$arch" ]
then
if [ -w "$arch" ]
then
rm -i $arch
else
echo "No tengo permisos para borrar $arch"
fi
else
echo "$arch no es un archivo"
fi
fi
}

(archivo: principal.sh)

#!/bin/bash
#
# Programa ejemplo para el uso de funciones en shell script
#

#
# Cargo las funciones en memoria
#
. lib/arch.sh
dir=./
for i in $dir/*
do
borrar $i
done

Notas sobre el ejemplo:

(archivo: lib/arch.sh)

Esta función toma el archivo a borrar como argumento (arch=$1), verifica que se le haya pasado un argumento realmente (if [ -z "$arch" ]), que un archivo pasado como argumento sea regular (if [ -f "$arch" ]) y que tenga permisos de escritura. En todos los casos de falsedad responde con un mensaje avisando el problema.

(archivo: principal.sh)

El programa hace un ciclo con los archivos de un directorio específico (for i in $dir/*) y se los pasa como argumento a la función borrar.

Valores de retorno

Las funciones pueden devolver valores de error utilizando el comando "return ". En caso de que no se especifique un valor de retorno de esta forma, el valor retornado será el que retorne el último comando ejecutado dentro de la función. Desafortunadamente no es posible asignar el valor retornado en una sola línea, siempre es necesario utilizar la variable especial "$?".

Ejemplo:

#!/bin/sh

func () {
return $1
}

func 0
echo "ret: ($?)"
func 1
echo "ret: ($?)"
func 2
echo "ret: ($?)"
func 3
echo "ret: ($?)"

Variables locales a la función

Existe la posibilidad de utilizar variables locales a la función, esto significa que la variable solamente va a existir durante la ejecución de la función.

Para crear una variable local a la función se utilizar el operador "local ".

Ejemplo:

func () {
local x
x=$1
echo "Dentro de la función \$x vale ($x)"
}

echo "Antes de ejecutar la función \$x vale ($x)"
func HOLA!!
echo "Después de ejecutar la función \$x vale ($x)"

Operaciones Aritméticas

Existen varias formas de calcular valores dentro de un shell script. Tradicionalmente, estos cálculos se hicieron con programas externos, esto generaba un retardo inmenso en la ejecución del shell script.

Hoy los nuevos intérpretes traen la posibilidad de hacer cálculos internamente. Para esto se utiliza una sintaxis especial, y es muy importante que los valores de las variables que utilicen para hacer estos cálculos sean números únicamente.

Uso

La sintaxis para hacer operaciones aritméticas es la siguiente:

$[]

Las operaciones que se pueden realizar son:

  • suma $((1+1))
  • resta $((2-1))
  • multiplicación $((2*2))
  • división $((2/2])
  • otras como suma de bits, sacar el módulo, evaluación de igualdad, etc.

Ejemplo:

#!/bin/sh
#
# Operaciones aritméticas
#
x=2
tot=$[$x+1]
echo "tot: ($tot)"

bc

A veces hay conjuntos de herramientas que nos suenan y no las aprovechamos al máximo. Quizás una de esas sea bc. La calculadora que podemos usar desde la consola, que aparte de sumar y restar puede realizar cálculos con una precisión de varios decimales, cambiar de base numérica o programarla, etc. veremos como...

Si ejecutamos bc veremos:

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

Acá espera que trabajemos desde la entrada estándar, por ejemplo:

4+8
12
scale=3
27/68
.397
halt

Sabe sumar (y restar, dividir, multiplicar; sin problemas).

Variables

Si queremos que trabaje con decimales, asignaremos un valor a la variable scale.

scale=3
2/3
.666

También podemos hacer:

scale=9;2/3
.666666666

Al ser scale una variable más, podemos consultar su valor sencillamente escribiéndola:

scale
3
#o también usando print
print scale
3

Otro ejemplo de usos de variables podría ser:

scale=5
variable=3
100/variable
33.33333

Hay una variable especial llamada last, almacena el resultado de la última operación:

100/3
33.33333
last*2
66.66666

Cambios en la base numérica

Hay dos variables especiales que son ibase y obase que definen la base de entrada y de salida de los números, respectivamente.

Si queremos calcular el número 5 en base 10 (decimal) a base 2 (binario), haremos:

obase=2
5
101

Si queremos pasar de binario a hexadecimal:

obase=16
ibase=2
11111111
FF

Otras operaciones matemáticas

Podemos usar también sqrt, 2^3, etc.

Si queremos tener operaciones matemáticas más complejas tenemos que ejecutar el bc -l para cargar la librería matemática:

s (x)   Seno de x, en radianes
c (x) Coseno de x
a (x) Arcotangente de x
l (x) Logaritmo neperiano de x
e (x) Exponencial de x
j (n,x) Función de Bessel de un entero de orden n de x

Aplicación en un script

Si queremos pedir que el usuario teclee algo por teclado, la función es read. Por tanto.

variable=read()

Esperará que tecleemos algo y lo pondrá en variable.

También podemos hacer un programa en un archivo y ejecutarlo:

print "Hola\n"
print "Escribe tu año de nacimiento\n"
nacimiento=read()
edad=2003-nacimiento
print edad
print " años\n"
halt

Y lo ejecutamos con bc -q archivo.bc (el -q es para que no muestre el Copyright) estaremos preguntando el año nacimiento y mostrando la edad.

Ahora un ejemplo definiendo una función, pasándole un parámetro y retornándolo. Veremos que es totalmente intuitivo:

define mayor_edad(edad) {
if (edad <>= 18)
return 1
}

print "Dí tus edad\n"
edad=read()

if (mayor_edad(edad))
print "Eres mayor de edad\n"

if (!mayor_edad(edad))
print "Eres menor de edad\n"

halt

Un último ejemplo, con un for:

for (i=0;i<10;i++)> 

Observemos en la , para separar la variable y la cadena en el print.

Para salir

halt

Otra forma muy útil en los scripts es:

resultado=$(echo "scale=3;2/3" | bc)

Operaciones lógicas y de comparación


test

Para usar if podemos usar un nuevo elemento, los corchetes que evalúan las condiciones, esto esta basado directamente en test. Y éste nos sirve para comparar variables.

Por ejemplo:

-lt Menor que
-eq Igual que
-gt Mayor que
-le Menor o igual que
-ge Mayor o igual que
-ne No coinciden
-a Operador lógico and
-o Operador lógico or
!= Distinto

Sintáxis:

exp1 operador exp2

Uso de test:

test 8 -lt 9

Usando variables en test:

variable1=5
variable2=3
test $variable1 -gt $variable2

Otra forma muy útil de uso de test (si 3 es menor que 5):

[ 3 -lt 5 ]

O (si $HACER es distinto de 1):

[ $HACER != 1 ]

Ejemplo:

#!/bin/bash
variable1=5
variable2=3
[ $variable1 -lt $variable2 ]
echo $?

Aqui hemos evaluado dos variables para ver si la variable1 era menor que la variable2 y para ver el resultado hemos acudido a la “variable de retorno”, que nos mostrara 0 o 1.

Cuando necesitamos utilizar la negación, debemos usar el signo !

Ejemplo:

 if [ ! -x $FILE ]
then
chmod +x $FILE
else
echo "$FILE es ejecutable"
fi

Si el archivo no es ejecutable, le damos permiso de ejecución, sino, imprimimos el mensaje por pantalla

Interacción con el usuario

Muchos programas no serían factibles si no tuviéramos algún mecanismo para interactuar con el usuario, ya sea un simple "Presione Enter para continuar" o algo más sofisticado, como una lista de opciones de las cuales escoger.

Cuando el programa está escrito en shell, es muy sencillo lograr ambas cosas, utilizando dos herramientas: read y dialog.

read

El comando read es muy sencillo. Le indicamos que pida el valor de una variable al usuario, el usuario escribe una línea de texto (es decir, cualquier cosa hasta que presione enter), y la variable toma el valor que el usuario ingresó.

Ejemplo:

[jose@xtech experto]$ read V
Hola mundo!
[jose@xtech experto]$ echo $V
Hola mundo!
[jose@xtech experto]$

Si deseamos sólo un "Presione enter para continuar" es exactamente lo mismo, simplemente ignoramos el valor de la variable :-)

dialog

Dialog es un programa que crea una "interfaz" para que el usuario interactúe, y entrega por la salida estándar el resultado de la acción del usuario, variable $?.

Puede producir preguntas si/no, menú, lista, calendario, barra de progreso, diálogo de contraseña, cuadro de texto, cuadro de mensaje, etc. Recomendamos leer la documentación del manual (man dialog) o ejecutar

dialog --help

Aparte del programa "dialog", que produce una salida por consola, puede ser que tenga en su sistema un programa "gdialog", Xdialog o "dldialog" (dependiendo del Linux que utilice), que son lo mismo, solo que abren una ventana gráfica, por X11, para el diálogo.

Sintaxis:

dialog  { --opciones específicas }

Ejemplo 1 (Diálogo "yesno"):

[jose@xtech experto]$ dialog --yesno "Desea salir?" 6 30

Produce esto:

Los argumentos 6 y 30 corresponden a la altura y ancho, respectivamente, del cuadro. En su versión X11, sería:

[jose@xtech experto]$ gdialog --yesno "Desea salir?"

Y se vería así:

Ejemplo 2 (Diálogo "inputbox"):

[jose@xtech experto]$ dialog --inputbox "Ingrese su nombre" 9 30 Juan

Note que agregamos el argumento "Juan", que será el valor predeterminado para este inputbox:

O también:

[jose@xtech experto]$ gdialog --inputbox "Ingrese su nombre"

Produce esto:

El caso del "inputbox" suele tener aparejado la necesidad de asignar ese valor ingresado a una variable. Para hacer eso tendremos que usar la siguiente sintáxis:

VARIABLE=`gdialog --inputbox "Ingrese su nombre" 2>&1`

Note que pusimos todo el comando entre comillas invertidas para que reemplace el mismo por el valor que el comando representa después de ejecutarse.

El 2>&1 es un truco que permite redirigir la STDERR hacia la STDOUT, ya que el valor ingresado sale por la salida de error en vez de la estándar.

Ejemplo 3 (Diálogo "msgbox"):

[jose@xtech experto]$ dialog --msgbox "Esto es muy bueno para mensajes" 5 50

Produce esto:

O también:

[jose@xtech experto]$ gdialog --msgbox "Esto es muy bueno para mostrar mensajes
largos o de advertencia"

Produce esto:

Ejercicio 1

Descompresión Automática de Archivos


Se debe ingresar el nombre de un archivo por la línea de comandos, y el script debe reconocer con qué herramienta está comprimida y proceder a descomprimirlo. Si el archivo no está comprimido, el script deberá devolver un mensaje de error.

TIP: utilizar el programa "file"

Resolución
#!/bin/bash
#
# Decompresor inteligente

if [ -z $1 ]
then
#
# Si no hay argumento salimos del script con error "1!
#
echo "Debe ingresar el nombre del archivo"
exit 1
else
ARCHIVO=$1
fi

TIPO=`file $ARCHIVO`
#
# Verificamos el tipo de archivo
# Salida del comando file:
#
# Para GZIP
# file ejemplo.gz
# ejemplo.gz: gzip compressed data, was "ejemplo",from Unix
#
# Para BZIP2
# file ejemplo.bz2
# ejemplo.bz2: bzip2 compressed data, block size =900k


case $TIPO in
"${ARCHIVO}: bzip2"*)
bunzip2 $ARCHIVO
;;
"${ARCHIVO}: gzip"*)
gunzip $ARCHIVO
;;
*)
echo "No esta comprimido"
;;
esac


exit 0

Ejercicio 2

Listado del Directorio Home


Se debe realizar un listado recursivo del directorio personal, y guardar la información en un archivo. Luego debe comprimirse ese archivo y preguntar al usuario en qué directorio quiere guardar el archivo comprimido.

Resolución
#/bin/bash
# Listado del Home

# Iniciamos la variable.
rm -rf ./listado.txt
touch ./listado.txt
ARCHIVO="./listado.txt"

# Listamos los archivos y los guardamos en el archivo
ls -1 ~ >> $ARCHIVO
cat $ARCHIVO

# Comprimimos el archivo como tar.gz
tar -czvf listado.tar.gz $ARCHIVO
COMPRIMIDO=listado.tar.gz

# Preguntamos al usuario donde desea guardar ese archivo.
echo "Por favor, ingrese el PATH donde desea almacenar $COMPRIMIDO."
read PATH
echo $PATH
echo $COMPRIMIDO

# Guardamos el archivo donde se indico.
mv $COMPRIMIDO $PATH

# Se imprime donde se guardo el archivo.
echo "Se guardo $COMPRIMIDO en $PATH"

exit 0

Ejercicio 3

Ralización de un backup diario


Se debe archivar como "tarball" (archivo .tar.gz) todos los archivos del directorio personal. Esto se debe hacer grabando un CR regrabable.

Resolución 1
#!/bin/bash
#
# Se limpia la pantalla para tener una salida más prolija.

clear

# Se procede a desmontar el CD por si alguien olvidó hacerlo.

echo "*** Desmontando CDROM ***"
umount /mnt/cdrom

# Se limpia nuevamente la pantalla.

clear

# Se anuncia al usuario que se comienza a borrar el CD.

echo "*** Borrando CDROM ***"
echo "Por favor, sea paciente. Este proceso puede demorar hasta 20 minutos."
echo " "

# Se utiliza el programa cdrecord para borrar el CD.

cdrecord -v -dev=ATAPI:0,0,0 -blank=fast > /dev/null

# Se borra nuevamente la pantalla.

clear

# Se anuncia por pantalla el comienzo del backup del directorio.

echo "*** Comenzando el backup ***"

# Se crea un directorio temporal para almacenar el backup.

mkdir /tmp/backup02

# Se limpia la pantalla.

clear

# Se anuncia por pantalla que se comienza a salvar el directorio personal.

echo "*** Backup del directorio Personal ***"

# Se comprime el directorio personal.

tar -cvzf /tmp/backuo02/home.tar.gz ~/ > /dev/null

# Se limpia la pantalla.

clear

# Se anuncia por pantalla que se realiza el ISO a grabar.

echo "*** Creando archivo de Resguardo ***"

# Se crea la imágen ISO.

mkisofs -r -J -o backup02.iso backup02/ > /dev/null

# Se borra la pantalla.

clear

# Se anuncia el comiezo de la grabación del CD.

echo "*** Comenzando la grabacion del CDROM ***"
echo "Por favor, sea paciente. Este proceso puede tardar hasta 30 minutos."
echo " "

# Se comienza a grabar el CD con cdrecord.

cdrecord -v speed=4 dev=ATAPI:0,0,0 -data backup02.iso > /dev/null

# Se anuncia en pantalla el borrado de los archivos auxiliares.

echo "*** Limpiando archivos extras ***"
rm -Rf /tmp/backup02.iso > /dev/null
rm -Rf /tmp/backup02 > /dev/null

# Se desmonta el CD.

umount /mnt/cdrom

# Se limpia la pantalla.

clear

# Se anuncia que el proceso finalizó con éxito.

echo "*** Se realizo el backup con exito ***"

exit 0
Resolución 2 (backup por SAMBA)
#!/bin/bash
#
# Se limpia la pantalla para tener una salida más prolija.

clear

# Se procede a desmontar el CD por si alguien olvidó hacerlo.

echo "*** Desmontando CDROM ***"
umount /mnt/cdrom

# Se limpia nuevamente la pantalla.

clear

# Se monta por red el CD de un cliente windows.

smbmount //pc3/d /mnt/cdrom -o username=usuario,password=contraseña

# Se borra nuevamente la pantalla.

clear

# Se anuncia por pantalla el comienzo del backup del directorio.

echo "*** Backup del directorio Personal ***"

# Se comprime el directorio personal.

tar -cvzf /mnt/cdrom/home.tar.gz ~/ > /dev/null

# Se desmonta el CD.

umount /mnt/cdrom

# Se limpia la pantalla.

clear

# Se anuncia que el proceso finalizó con éxito.

echo "*** Se realizo el backup con exito ***"

exit 0

8/17/2008


Bashish y aléjate de la consola...oscura claro.

Bashish es un tema para terminales de texto. Puede cambiar los colores, tipo de letra,
la transparencia y la imagen de fondo para cada aplicación. Adicionalmente
Bashish puede funcionar en bash, zsh y tcsh.

Para instalarlo en arch:

yaourt -S bashish
Ejemplos:

A red sky with the siluette of a city in dawn..
urbandawn

a snake crawling up to the prompt
conda


3D steel like finish
bluesteel


A new poker hand each time the prompt is pressed.
poker


an ascii-art prompt similar to the lcars interface from startrek
lcars

A red square around the terminal
box


Commodore 64 screen with some error messages
c64 - ?SYNTAX ERROR


Fading prompt
fade


A cow stretched over the whole terminal.
moo


Simulation of a 3270 terminal connectiong to IBM MVS
mvs


pink terminal with saturated flowers
flowerpower

7/13/2008


Montar pendrive o disco extraible manualmente en Gnu/Linux

Bueno seguimos con el montado de discos, recomiendo que lean el anterior articulo sobre UUID entre otras cosas y claro para comprender que estamos haciendo tener conocimientos sobre el fstab.

Muchas veces tenemos la necesidad de montar un disco extraible o un pendrive, en mi caso tengo un reproductor de MP3 y prácticamente es lo mismo en el funcionamiento de almacenamiento.
Prosigamos...

Se acuerdan que no tengo instalado HAL, por lo tanto, cuando yo conecte un disco extraible voy a tener que montarlo manualmente, o en el mejor de los casos, agregarlo al fichero /etc/fstab para que al iniciar el equipo lo monte automáticamente o que se mantenga en estado de espera, es decir esperando ser montado al ser detectado.

Primero conectemos el dispositivo y luego verificamos(como root) que aparezca en el listado de discos del comando fdisk.


[root@ArchLinux braianet]# fdisk -l

Disco /dev/sda: 40.0 GB, 40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Disk identifier: 0x4c2ba12c

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sda1 * 2 2365 18988830 7 HPFS/NTFS
/dev/sda2 2366 4675 18555075 83 Linux
/dev/sda3 4761 4865 843412+ 82 Linux swap / Solaris
/dev/sda4 4676 4760 682762+ 83 Linux

Las entradas de la tabla de particiones no están en el orden del disco

Disco /dev/sdb: 15.0 GB, 15020457984 bytes
16 heads, 63 sectors/track, 29104 cylinders
Units = cilindros of 1008 * 512 = 516096 bytes
Disk identifier: 0x90909090

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sdb1 1 1008 508000+ 82 Linux swap / Solaris
/dev/sdb2 * 1009 15540 7324128 83 Linux
/dev/sdb3 15541 29104 6836256 83 Linux

Disco /dev/sdc: 522 MB, 522043904 bytes
17 heads, 59 sectors/track, 1016 cylinders
Units = cilindros of 1003 * 512 = 513536 bytes
Disk identifier: 0x20736f63

Esto no parece una tabla de particiones
Probablemente ha seleccionado el dispositivo que no era.
Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sdc1 ? 1911394 2454136 272185273 6f Desconocido
La partición 1 tiene distintos principios físicos/lógicos (¿no Linux?):
físicos=(361, 101, 36) lógicos=(1911393, 0, 3)
La partición 1 tiene distintos finales físicos/lógicos:
físicos=(255, 115, 46) lógicos=(2454135, 5, 27)
La partición 1 no termina en un límite de cilindro.
/dev/sdc2 ? 1338820 2115804 389657273 69 Desconocido
La partición 2 tiene distintos principios físicos/lógicos (¿no Linux?):
físicos=(100, 101, 32) lógicos=(1338819, 12, 59)
La partición 2 tiene distintos finales físicos/lógicos:
físicos=(367, 115, 35) lógicos=(2115803, 6, 6)
La partición 2 no termina en un límite de cilindro.
/dev/sdc3 ? 168145 168145 0 20 Desconocido
La partición 3 tiene distintos principios físicos/lógicos (¿no Linux?):
físicos=(353, 117, 46) lógicos=(168144, 10, 47)
La partición 3 tiene distintos finales físicos/lógicos:
físicos=(355, 116, 37) lógicos=(168144, 10, 46)
La partición 3 no termina en un límite de cilindro.
/dev/sdc4 2877051 2877106 27619 0 Vacía
La partición 4 tiene distintos principios físicos/lógicos (¿no Linux?):
físicos=(0, 0, 0) lógicos=(2877050, 0, 3)
La partición 4 tiene distintos finales físicos/lógicos:
físicos=(0, 0, 0) lógicos=(2877105, 1, 16)
La partición 4 no termina en un límite de cilindro.

Las entradas de la tabla de particiones no están en el orden del disco
[root@ArchLinux braianet]#
Las líneas azules, nos indican los diferentes discos y lo que marque de rojo es una falencia en el sistema de archivos del reproductor de mp3, porque como sabrán, tiene una partición para su propio sistema(fabricante, firmware, etc), no se preocupen por esto.

Bueno el disco extraible se encuentra en:
Disco /dev/sdc: 522 MB, 522043904 bytes

Ahora lo montaremos manualmente si necesitan utilizarlo solo una vez, al ser montado como root, solo él puede modificar su contenido:

Método común

# mkdir /media/MP3
# mount -t vfat /dev/sdc /media/MP3

Lo que hicimos fué crear un directorio en /media llamado MP3 y luego montarlo. El parámetro -t es para el tipo, en este caso es un sistema fat32(vfat lo llama linux).
/dev/sdc es la ruta para el dispositivo, y /media/MP3 el directorio donde se montará.

Esta opcion nos quitará mas de un apuro pero no lo recomiendo si van a utilizar el disco extraíble continuamente.

Método modificando el Fstab

Llegamos a lo que necesitaba, este artículo en sí, lo hice para explicar esto, pero no podía empezar asi de la nada. Es la mejor opción si no cuenta con hal.

Obtenemos el UUID del disco extraíble:
[root@ArchLinux braianet]# blkid
/dev/sda1: UUID="100CA78D0CA76D02" TYPE="ntfs"
/dev/sda2: UUID="5e716466-9f33-44c3-8455-383c8d1e9a10" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda3: TYPE="swap" UUID="fe97b59c-3776-452c-9232-65966a5cc230"
/dev/sda4: UUID="11f5a43a-5904-47bf-845d-8d95ac8730d4" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdb1: TYPE="swap" UUID="70c4f0be-c6a0-449e-b2f2-b9689d1f93b6"
/dev/sdb2: UUID="dfa49bd0-dd2c-4c76-a318-a044fc691a6a" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdb3: UUID="7824e60c-2dfd-4919-88df-b672eea43400" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdc: LABEL="BR414N" UUID="7453-103F" TYPE="vfat"
[root@ArchLinux braianet]#
Modificamos el fstab y agregamos:

UUID=7453-103F /media/MP3 vfat rw,noauto,user,async,gid=100 0 0

Explicación:
rw: significa lectura y escritura.
noauto: significa que no se monte cuando inicie el sistema, ya que puede no estar conectado.
user:Permite a cualquier usuario del sistema montar o desmontar un dispositivo físico sin necesidad de ser root.
async: Con esto hacemos que las operaciones que realicemos no se hagan de forma asíncrona. Elegi esta opcion porque me funcionó mas rápido,aunque sync es mejor para no tener un solo error.
gid: el grupo especificado tiene el control sobre los archivos del dispositivo. En mi caso el el numero 100 que es el grupo users, ustedes pueden tener otro número, consulten con el comando id.

Ahora solo nos queda teclear mount /dev/sdc como usuario normal y listo o si tienen Gnome cuando lo conecten ya les mostrá el ícono, solo será necesario hacer click
Si quieren demontarlo y no saben porque le tira el error:

[root@ArchLinux Pascal]# umount /dev/sdc
umount: /media/MP3: dispositivo ocupado
umount: /media/MP3: dispositivo ocupado
Utilicen el comando lsof para saber que es lo que esta impidiendo al mismo, ahí nos muestra el PID y si desean matar el proceso utilicen el comando kill.
[root@ArchLinux Pascal]# lsof /dev/sdc
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 3042 root cwd DIR 8,32 4096 3884 /media/MP3/Pascal
lsof 3312 root cwd DIR 8,32 4096 3884 /media/MP3/Pascal
lsof 3313 root cwd DIR 8,32 4096 3884 /media/MP3/Pascal
[root@ArchLinux Pascal]#
Espero que le haya servido. Saludos!

7/11/2008


Comandos equivalentes del MS-DOS a Gnu/Linux

Para los que han usado MS-DOS por muchos años y pretenden pasar a sistemas Linux, es muy útil tener una tabla con comandos equivalentes de ambos sistemas operativos.

A continuación, un listado con los comando más comunes:

Comando DOS Comando Linux
cd directorio cd directorio
dir, dir/w ls, ls -l
chdir (directorio actual) pwd
del (borra un archivo) rm
deltree (borra un directorio y todo su contenido) rm -r
copy cp
xcopy (copia todo el contenido de un directorio) cp -R
rename, move mv
type (imprime el contenido de un archivo a la pantalla) cat
help, [comando] /? man
cls (limpia la pantalla) clear
find (busca por una palabra(s) en un determinado archivo) grep
fc (compara 2 archivos y encuentra diferencias entre ellos) diff
set (muestra variable de entorno) env
set variable (fija una variable de entorno) export
edit nombre-de-archivo vi archivo, pico archivo, nano -w archivo (varios basados en el editor de tu preferencia)
attrib +h archivo (fija un archivo como oculto) mv file .file
mem (muestra la memoria disponible) free, top
scandisk fsck
defrag c:\ debugfs
format mke2fs, mk32fs -j, mkreiserfs, mkswap, etc. (varios basados en el sistema de archivos de tu preferencia)
pkzip (crea un paquete de archivos) tar, utilizado en conjunto con gzip para compresión)
tracert traceroute
ipconfig (visualiza dirección IP y configuración de red) ifconfig
nbtstat -a nombrehost (toma la información DNS de un determinado host) nslookup nombrehost
route print (muestra tablas de ruteo) route -n
net send host/ip message (envia un mensaje a otro computador) smbclient -M Windows Host, talk (Linux hosts)


Fuente: archivogeek.com

7/10/2008


UUID, Labels, Particiones y Fstab

Antes de comenzar a hablar sobre UUID y Labels es necesario conocer el funcionamiento del fichero /etc/fstab, pueden ingresar en la siguiente entrada donde se habla del mismo.
En la última versión de Archlinux(Core Dump), podemos observar que una de las características sobresaliente es la siguiente:

"- Se utilizan los UUID para una nomenclatura persistente de discos".

A decir verdad, no tenía ni la menor idea de lo que significaba, claro hasta hoy que necesité montar un disco. Hacía mucho no montaba nada, luego de instalar hal ni me preocupaba por las conexiones usb o discos posteriores que pudiera conectar en mi máquina, ya que lo detectaba automáticamente...
Pero no todo es color de rosa, en Gnome, hal me molestaba, noté una baja de velocidad al iniciar ya que detecta los discos u particiones que tuviese en el equipo, y bueno lo terminé desactivando.
Ahora era necesario editar el fstab para poder montar de nuevo aquellas particiones desde el inicio y me encontré con algunas sorpresas, veamos que nos muestra /etc/fstab:


#
# /etc/fstab: static file system information
#
# <filesystem> <dir> <type> <options> <dump> <pass>
none /dev/pts devpts defaults 0 0
none /dev/shm tmpfs defaults 0 0


/dev/cdrom /media/cdrom auto ro,user,noauto,unhide 0 0
UUID=70c4f0be-c6a0-449e-b2f2-b9689d1f93b6 swap swap defaults 0 0
UUID=7824e60c-2dfd-4919-88df-b672eea43400 /home ext3 defaults 0 1
UUID=dfa49bd0-dd2c-4c76-a318-a044fc691a6a / ext3 defaults 0 1
Como podrán observar ha aparecido un nuevo campo(columna) en la parte donde se declaran los discos, llamada UUID.

Algo de teoría


Utilizando nombres persistentes en dispositivos de bloques:

Mientras que las distribuciones Gnu/Linux están evolucionando y la detección de hardware es más confiable, hay un número de nuevos problemas y también de nuevos cambios:
  • Si usted tiene más de un controlador de discos sata/scsi o ide, el orden en que es agregado al sistema es al azar. Esto da como resultados nombres de dispositivos como hdX y hdY variando al azar con cada arranque. Lo mismo para los sdX y sdY. El uso de nombres persistentes permite que el usuario no se tenga que preocupar de ninguna manera por esto.
  • Con la introducción del nuevo soporte para libata pata, todos los dispositivos hdX serán dispositivos sdX en el futuro. Nuevamente, con nombramientos persistente, puede ser que ni se note este cambio.
  • Máquinas con controladores sata e ide son bastante común hoy en día. Con los cambios libata mencionados anteriormente, el primer problema no se presentará, así que ambos discos, sata e ide tendrán nombres sdX.
¿Qué nombre debo usar?

Hay cuatro métodos diferentes para utilizar nombres persistentes.

Por UUID (by-uuid): UUID significa Identificador Único Universal(Universally Unique Identifier) y es un mecanismo para dar a cada sistema de archivos un identificador único. Esta diseñado para que las colisiones sean poco probables. Todos las sistemas de archivos de Gnu/Linux (incluyendo el swap) soportan UUID. Los sistemas de archivos FAT y NTFS no soportan UUID, pero se encuentran listados en "by-uuid" con una identificador único. Método Recomendado:
[root@ArchLinux braianet]# ls -lF /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 jul 10 12:24 100CA78D0CA76D02 -> ../../sda1
lrwxrwxrwx 1 root root 10 jul 10 12:24 11f5a43a-5904-47bf-845d-8d95ac8730d4 -> ../../sda4
lrwxrwxrwx 1 root root 10 jul 10 12:24 5e716466-9f33-44c3-8455-383c8d1e9a10 -> ../../sda2
lrwxrwxrwx 1 root root 10 jul 10 12:24 70c4f0be-c6a0-449e-b2f2-b9689d1f93b6 -> ../../sdb1
lrwxrwxrwx 1 root root 10 jul 10 12:24 7824e60c-2dfd-4919-88df-b672eea43400 -> ../../sdb3
lrwxrwxrwx 1 root root 10 jul 10 12:24 dfa49bd0-dd2c-4c76-a318-a044fc691a6a -> ../../sdb2
lrwxrwxrwx 1 root root 10 jul 10 12:24 fe97b59c-3776-452c-9232-65966a5cc230 -> ../../sda3
[root@ArchLinux braianet]#
Como puede ver, los particiones fat y ntfs (100CA78D0CA76D02 --> NTFS) tienen nombres cortos, pero todavía están listado. La ventaja de usar el método "uuid" es que es mucho menos probable que puede tener una colisión que con labels (etiquetas); la desventaja es que son mucho más difícil de memorizar.

Por etiqueta(by-label): En Archlinux no contamos con este método.
Casi todos los tipos de sistemas de archivos pueden usar un "label". Todos los particiones que tiene una están listada en el directorio /dev/disk/by-label:
$ ls -lF /dev/disk/by-label
total 0
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data -> ../../sdb2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 data2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Oct 16 10:27 fat -> ../../sda6
lrwxrwxrwx 1 root root 10 Oct 16 10:27 home -> ../../sda7
lrwxrwxrwx 1 root root 10 Oct 16 10:27 root -> ../../sda1
lrwxrwxrwx 1 root root 10 Oct 16 10:27 swap -> ../../sda5
lrwxrwxrwx 1 root root 10 Oct 16 10:27 windows -> ../../sdb1
Puede cambiar estas etiquetas de la sistema de archivos utilizando estos comandos:
* swap: Crear un nuevo área de intercambio, así: mkswap -L 
Tenga cuidado: Las etiquetas tienen que ser únicas para hacer este trabajo, a fin de asegurar su correcto funcionamiento.

Por Id (by-id):
Crea un nombre único en función del número de serie de hardware. Ej:
[root@ArchLinux braianet]# ls -lF /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root 9 jul 10 12:24 ata-ST340823A_6EF0VBZA -> ../../sda
lrwxrwxrwx 1 root root 10 jul 10 12:24 ata-ST340823A_6EF0VBZA-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 jul 10 12:24 ata-ST340823A_6EF0VBZA-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 jul 10 12:24 ata-ST340823A_6EF0VBZA-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 jul 10 12:24 ata-ST340823A_6EF0VBZA-part4 -> ../../sda4
lrwxrwxrwx 1 root root 9 jul 10 12:24 ata-WDC_WD150AA-34BAA0_WD-WMA2N1336879 -> ../../sdb
lrwxrwxrwx 1 root root 10 jul 10 12:24 ata-WDC_WD150AA-34BAA0_WD-WMA2N1336879-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 jul 10 12:24 ata-WDC_WD150AA-34BAA0_WD-WMA2N1336879-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 10 jul 10 12:24 ata-WDC_WD150AA-34BAA0_WD-WMA2N1336879-part3 -> ../../sdb3
lrwxrwxrwx 1 root root 9 jul 10 12:24 scsi-SATA_ST340823A_6EF0VBZA -> ../../sda
lrwxrwxrwx 1 root root 10 jul 10 12:24 scsi-SATA_ST340823A_6EF0VBZA-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 jul 10 12:24 scsi-SATA_ST340823A_6EF0VBZA-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 jul 10 12:24 scsi-SATA_ST340823A_6EF0VBZA-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 jul 10 12:24 scsi-SATA_ST340823A_6EF0VBZA-part4 -> ../../sda4
lrwxrwxrwx 1 root root 9 jul 10 12:24 scsi-SATA_WDC_WD150AA-34BWD-WMA2N1336879 -> ../../sdb
lrwxrwxrwx 1 root root 10 jul 10 12:24 scsi-SATA_WDC_WD150AA-34BWD-WMA2N1336879-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 jul 10 12:24 scsi-SATA_WDC_WD150AA-34BWD-WMA2N1336879-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 10 jul 10 12:24 scsi-SATA_WDC_WD150AA-34BWD-WMA2N1336879-part3 -> ../../sdb3
[root@ArchLinux braianet]#
Por ruta (by-path): Crea un nombre único, dependiendo de la ruta más corta física (de acuerdo a sysfs). Ambos contienen cadenas para indicar al subsistema al que pertenecen (es decir, "-ide-", por "by-path", y "ata-" por "by-id ') y, por lo tanto, no son adecuadas para la solución de los problemas mencionados en el principio de este artículo. No recomendado utilizar este método.
[root@ArchLinux braianet]# ls -lF /dev/disk/by-path/
total 0
lrwxrwxrwx 1 root root 9 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:0:0-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:0:0-part4 -> ../../sda4
lrwxrwxrwx 1 root root 9 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:1:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:1:0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:1:0-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 10 jul 10 12:24 pci-0000:00:00.1-scsi-0:0:1:0-part3 -> ../../sdb3
lrwxrwxrwx 1 root root 9 jul 10 12:24 pci-0000:00:00.1-scsi-1:0:1:0 -> ../../sr0
[root@ArchLinux braianet]#
Basta de Teoría je. Ahora continuemos con mi objetivo, poder montar una partición, vemos las particiones en mi sistema con el comando fdisk -l:

[root@ArchLinux braianet]# fdisk -l

Disco /dev/sda: 40.0 GB, 40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Disk identifier: 0x4c2ba12c

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sda1 * 2 2365 18988830 7 HPFS/NTFS
/dev/sda2 2366 4675 18555075 83 Linux
/dev/sda3 4761 4865 843412+ 82 Linux swap / Solaris
/dev/sda4 4676 4760 682762+ 83 Linux

Las entradas de la tabla de particiones no están en el orden del disco

Disco /dev/sdb: 15.0 GB, 15020457984 bytes
16 heads, 63 sectors/track, 29104 cylinders
Units = cilindros of 1008 * 512 = 516096 bytes
Disk identifier: 0x90909090

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sdb1 1 1008 508000+ 82 Linux swap / Solaris
/dev/sdb2 * 1009 15540 7324128 83 Linux
/dev/sdb3 15541 29104 6836256 83 Linux
[root@ArchLinux braianet]#
Quiero agregar /dev/sda2 al fstab pero no conozco su UUID, ahora lo averiguaremos, tenemos dos opciones, una es haciendo un ls -l /dev/disk/by-uuid y la otra es utilizando el comando blkid, la segunda opción es la que recomiendo:
[root@ArchLinux braianet]# blkid 
/dev/sda1: UUID="100CA78D0CA76D02" TYPE="ntfs"
/dev/sda2: UUID="5e716466-9f33-44c3-8455-383c8d1e9a10" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda3: TYPE="swap" UUID="fe97b59c-3776-452c-9232-65966a5cc230"
/dev/sda4: UUID="11f5a43a-5904-47bf-845d-8d95ac8730d4" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdb1: TYPE="swap" UUID="70c4f0be-c6a0-449e-b2f2-b9689d1f93b6"
/dev/sdb2: UUID="dfa49bd0-dd2c-4c76-a318-a044fc691a6a" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdb3: UUID="7824e60c-2dfd-4919-88df-b672eea43400" SEC_TYPE="ext2" TYPE="ext3"
[root@ArchLinux braianet]#
Ya obtuvimos su UUID, el tipo de sistema es ext2/3. Creamos un directorio en /media llamado Datos_Linux y lo agregamos al fstab:

#
# /etc/fstab: static file system information
#
# <filesystem> <dir> <type> <options> <dump> <pass>
none /dev/pts devpts defaults 0 0
none /dev/shm tmpfs defaults 0 0


/dev/cdrom /media/cdrom auto ro,user,noauto,unhide 0 0
UUID=70c4f0be-c6a0-449e-b2f2-b9689d1f93b6 swap swap defaults 0 0
UUID=7824e60c-2dfd-4919-88df-b672eea43400 /home ext3 defaults 0 1
UUID=dfa49bd0-dd2c-4c76-a318-a044fc691a6a / ext3 defaults 0 1
UUID=5e716466-9f33-44c3-8455-383c8d1e9a10 /media/Datos_Linux defaults 0 2
Bueno ya logré lo que buscaba, espero que les haya resultado útil el artículo, lo recomendable es utilizar el UUID en el Grub, así independientemente del lugar donde conecten sus discos se podrá bootear igual.

Ejemplo de mi /boot/grub/menu.lst:
# (0) Arch Linux
title Arch Linux (Core Dump)
root (hd1,1)
kernel /boot/vmlinuz26 root=/dev/disk/by-uuid/dfa49bd0-dd2c-4c76-a318-a044fc691a6a ro
initrd /boot/kernel26.img

# (1) Arch Linux
title Arch Linux Fallback
root (hd1,1)
kernel /boot/vmlinuz26 root=/dev/disk/by-uuid/dfa49bd0-dd2c-4c76-a318-a044fc691a6a ro
initrd /boot/kernel26-fallback.img
#
# (1) Windows
title Windows
rootnoverify (hd0,0)
makeactive
chainloader +1
[braianet@ArchLinux ~]$
Con Gnu/Linux siempre algo nuevo se aprende todos los días. Saludos!

Referencias: wiki.archlinux.org, dalealteclado.com, manual.sidux.com

6/26/2008


Ver los puertos abiertos en Gnu/Linux

Los siguientes comandos nos ayudaran a ver los sockets/puertos LISTEN o en escucha. Quiere decir los puertos abiertos, preparados para establecer una conexion.

# netstat -an | grep LISTEN
Muestra todos los sockets en estado LISTEN

# lsof -i
Muestra todas las conexiones a internet

#socklist
Nos muestra la lista de los sockets abiertos

# netstat -anp --udp --tcp | grep LISTEN
Nos muestra solo los puertos LISTEN

# netstat -tup
Lista las conexiones activas a/desde nuestro sistema

# netstat -tupl
Lista los puertos en escucha

3/21/2008


Traducción de palabras con dict en Gnu/Linux!

Dict, es un cliente para el servidor de diccionarios(DICTD). Quién realiza una transacción TCP basada en petición/respuesta que permite a un cliente acceder a definiciones de diccionario, por medio de bases de datos de lenguajes naturales.
La mayoría de las distribuciones lo incluyen en su paquete base, pero si no lo tiene pueden instalarlo como dictd o dict.
Para la traducción de palabrás es necesario contar con una conexión a internet.

En Arch:

pacman -S dictd

Comandos básicos de Dict:

[braianet@ArchLinux ~]$ dict --help
dict 1.9.15/rf on Linux 2.6.24-ARCH
Copyright 1997-2002 Rickard E. Faith (faith@dict.org)

Usage: dict [options] [word]
Query a dictd server for the definition of a word

-h --host (server) specify server
-p --port specify port
-d --database select a database to search
-m --match match instead of define
-s --strategy strategy for matching or defining
-c --config specify configuration file
-C --nocorrect disable attempted spelling correction
-D --dbs show available databases
-S --strats show available search strategies
-H --serverhelp show server help
-i --info show information about a database
-I --serverinfo show information about the server
-a --noauth disable authentication
-u --user username for authentication
-k --key shared secret for authentication
-V --version display version information
-L --license display copyright and license information
--help display this help
-v --verbose be verbose
-r --raw trace raw transaction
-P --pager program specify program to use as pager (- for none)
--debug set debugging flag
--pipesize specify buffer size for pipelining (256)
--client additional text for client command
[braianet@ArchLinux ~]$


Si por ejemplo ejecuto dict y paso como parámetro "speak", me aparecería lo siguiente:

braianet ~ $ dict speak
4 definitions found

From The Collaborative International Dictionary of English v.0.48 [gcide]:

Speak \Speak\, v. i. [imp. {Spoke}({Spake}Archaic); p. p.
{Spoken}({Spoke}, Obs. or Colloq.); p. pr. & vb. n.
{Speaking}.] [OE. speken, AS. specan, sprecan; akin to
OF.ries. spreka, D. spreken, OS. spreken, G. sprechen, OHG.
sprehhan, and perhaps to Skr. sph[=u]rj to crackle, to
thunder. Cf. {Spark} of fire, {Speech}.]
1. To utter words or articulate sounds, as human beings; to
express thoughts by words; as, the organs may be so
obstructed that a man may not be able to speak.
[1913 Webster]

Till at the last spake in this manner. --Chaucer.
[1913 Webster]

Speak, Lord; for thy servant heareth. --1 Sam. iii.
9.
[1913 Webster]

2. To express opinions; to say; to talk; to converse.
[1913 Webster]

That fluid substance in a few minutes begins to set,
as the tradesmen speak. --Boyle.
[1913 Webster]

An honest man, is able to speak for himself, when a
knave is not. --Shak.
[1913 Webster]

During the century and a half which followed the
Conquest, there is, to speak strictly, no English
history. --Macaulay.
[1913 Webster]
...

Como podemos observar es un diccionario, pero lamentablemente solamente da definiciones en inglés, pero podemos utilizar dict como un traductor español-inglés o inglés-español. Utilizamos el parámetro -D para listar todas las bases de datos disponibles.

braianet ~ $ dict -D
Databases available:
gcide The Collaborative International Dictionary of English v.0.48
wn WordNet (r) 2.0
moby-thes Moby Thesaurus II by Grady Ward, 1.0
elements Elements database 20001107
vera Virtual Entity of Relevant Acronyms (Version 1.9, June 2002)
jargon Jargon File (4.3.1, 29 Jun 2001)
foldoc The Free On-line Dictionary of Computing (27 SEP 03)
easton Easton's 1897 Bible Dictionary
hitchcock Hitchcock's Bible Names Dictionary (late 1800's)
bouvier Bouvier's Law Dictionary, Revised 6th Ed (1856)
devils THE DEVIL'S DICTIONARY ((C)1911 Released April 15 1993)
world02 CIA World Factbook 2002
gazetteer U.S. Gazetteer (1990)
gaz-county U.S. Gazetteer Counties (2000)
gaz-place U.S. Gazetteer Places (2000)
gaz-zip U.S. Gazetteer Zip Code Tabulation Areas (2000)
--exit-- Stop default search here.
afr-deu Africaan-German Freedict dictionary
afr-eng Africaan-English Freedict Dictionary
ara-eng English-Arabic Freedict Dictionary
cro-eng Croatian-English Freedict Dictionary
cze-eng Czech-English Freedict dictionary
dan-eng Danish-English Freedict dictionary
deu-eng German-English Freedict dictionary
deu-fra German-French Freedict dictionary
deu-ita German-Italian Freedict dictionary
deu-nld German-Nederland Freedict dictionary
deu-por German-Portugese Freedict dictionary
eng-afr English-Africaan Freedict Dictionary
eng-ara English-Arabic FreeDict Dictionary
eng-cro English-Croatian Freedict Dictionary
eng-cze English-Czech fdicts/FreeDict Dictionary
eng-deu English-German Freedict dictionary
eng-fra English-French Freedict Dictionary
eng-hin English-Hindi Freedict Dictionary
eng-hun English-Hungarian Freedict Dictionary
eng-iri English-Irish Freedict dictionary
eng-ita English-Italian Freedict dictionary
eng-lat English-Latin Freedict dictionary
eng-nld English-Netherlands Freedict dictionary
eng-por English-Portugese Freedict dictionary
eng-rom English-Romanian FreeDict dictionary
eng-rus English-Russian Freedict dictionary
eng-spa English-Spanish Freedict dictionary
eng-swa English-Swahili xFried/FreeDict Dictionary
eng-swe English-Swedish Freedict dictionary
eng-tur English-Turkish FreeDict Dictionary
eng-wel English-Welsh Freedict dictionary
fra-deu French-German Freedict dictionary
fra-eng French-English Freedict dictionary
fra-nld French-Nederlands Freedict dictionary
hin-eng English-Hindi Freedict Dictionary [reverse index]
hun-eng Hungarian-English FreeDict Dictionary
iri-eng Irish-English Freedict dictionary
ita-deu Italian-German Freedict dictionary
jpn-deu Japanese-German Freedict dictionary
kha-deu Khasi-German FreeDict Dictionary
lat-deu Latin-German Freedict dictionary
lat-eng Latin-English Freedict dictionary
nld-deu Nederlands-German Freedict dictionary
nld-eng Nederlands-English Freedict dictionary
nld-fra Nederlands-French Freedict dictionary
por-deu Portugese-German Freedict dictionary
por-eng Portugese-English Freedict dictionary
sco-deu Scottish-German Freedict dictionary
scr-eng Serbo-Croat-English Freedict dictionary
slo-eng Slovenian-English Freedict dictionary
spa-eng Spanish-English Freedict dictionary
swa-eng Swahili-English xFried/FreeDict Dictionary
swe-eng Swedish-English Freedict dictionary
tur-deu Turkish-German Freedict dictionary
tur-eng Turkish-English Freedict dictionary
english English Monolingual Dictionaries
trans Translating Dictionaries
all All Dictionaries (English-Only and Translating)
web1913 Webster's Revised Unabridged Dictionary (1913)
world95 The CIA World Factbook (1995)
braianet ~ $

Listo ahora solo debemos seleccionar la base de datos que nos interese, como podrán ver tenemos varios base de datos de idiomas para seleccionar.
El parámetro -d selecciona.

Traductor español-inglés:

braianet ~ $ dict -d spa-eng hablar
1 definition found

From Spanish-English Freedict dictionary [spa-eng]:

hablar
speak, talk(paroli)
braianet ~ $

Traductor inglés-español:

braianet ~ $ dict -d eng-spa speak
1 definition found

From English-Spanish Freedict dictionary [eng-spa]:

speak [spiːk]
hablar
braianet ~ $

Simplificando los comandos anteriores, crearemos alias para llamarlos sencillamente desde la consola, agregamos las siguientes líneas a ~/.bashrc.

alias ing-esp='dict -d eng-spa'
alias esp-ing='dict -d spa-eng'

Luego reiniciamos la terminal y probamos:

Ing-Esp

braianet ~ $ ing-esp speak
1 definition found

From English-Spanish Freedict dictionary [eng-spa]:

speak [spiːk]
hablar

Esp-Ing

braianet ~ $ esp-ing hablar

1 definition found

From Spanish-English Freedict dictionary [spa-eng]:

hablar
speak, talk(paroli)
braianet ~ $

Si el diccionario que necesitan no está en la base de datos de dict.org, pueden buscar en otros servidores dict.
dict://vocabulary.aioe.org
posee una gran cantidad de diccionarios
Deberán utilizar el parámetro -h para usarlo, -D lista las base de datos.

braianet ~ $ dict -h vocabulary.aioe.org -D


Por úlitmo, para no utilizar el parámetro -h, pueden agregar los servidores al archivo /etc/dict/dict.conf (en mi caso).

#server localhost
#server dict.org
server vocabulary.aioe.org

Espero que les resulte útil el uso, ya que a mí me simplificó bastante con la traducción de palabras, aunque no contengan mucha cantidad. Saludos!

3/07/2008


Modificar Xterm

Este es mi archivo de configuración ~/.Xdefaults, quiero guardarlo para no perderlo, parece irónico. Si alguien necesita modificar la apariencia horrible de Xterm puede usarlo sin problemas :)

XTerm*faceName: Bitstream Vera Sans Mono
XTerm*faceSize: 13
XTerm*cacheDoublesize: 4
XTerm*cursorBlink: false
XTerm*cursorColor: yellow
XTerm*cursorOffTime: 250
XTerm*cursorOnTime: 300
XTerm*background: #000000
XTerm*foreground: white
XTerm*italicULMode: true
XTerm*scrollBar: false
XTerm*rightScrollBar: true
XTerm*saveLines: 1000
XTerm*scrollTtyOutput: false
XTerm*scrollKey: true
XTerm*jumpScroll: true
XTerm*multiScroll: true

3/04/2008


Resolución en las TTY (Modo texto)

Al arrancar GNU/Linux, los usuarios pueden querer cambiar la resolución de pantalla donde nos muestra el típico proceso de arranque. Esta resolución es la que se usa luego en la tty para escribir comandos fuera del entorno gráfico. Ya sabemos una forma de acceder a las tty (Ctrl + Alt + Teclas F).

Para cambiar dicha resolución de la tty a voluntad, debemos editar el fichero de configuración de grub denominado menu.lst (/boot/grub/menu.lst).

La linea que debemos modificar son las referentes a “kernel”, añadiendo vga=resolución.

Ejemplo:

kernel /boot/vmlinuz-Busi root=/dev/hdb3 splash vga=792

Tabla de resoluciones:


640×480 - 800×600 - 1024×768 - 1280×1024
vga=769 - vga=771 - vga=773 - vga=775 - > 8 bits
vga=785 - vga=788 - vga=791 - vga=794 - > 16 bits
vga=786 - vga=789 - vga=792 - vga=795 - > 32 bits

Dependiendo de la resolución y la distro se podrá ver un Tux en la esquina superior izquierda de la pantalla.

En Arch utilicé la siguiente línea:

kernel /vmlinuz26 root=/dev/sda2 ro vga=788

Y me apareció el logo en la esquina superior izquierda cuando inicia el sistema. Saludos!


Fuente:
http://www.busindre.com/resolucion-en-las-tty-modo-texto/

3/03/2008


Y al final los animales hablaron!...en linux claro.

cowsay es un pequeño y simpático programa que todo lo que hace es mostrar una vaca (o cualquiera de otras 50 o más figuras) con el mensaje que se indique, una vez instalado, su forma más básica sería la siguiente:


braianet ~ $ cowsay Aumentó el precio de mi carne!
_________________________________
Aumentó el precio de mi carne!
---------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
braianet ~ $


Aunque tenemos una enorme varidedad de animales o figuras para seleccionar:

braianet ~ $ cowsay -l
Cow files in /usr/share/cows:
beavis.zen bong bud-frogs bunny cheese cower daemon default dragon
dragon-and-cow elephant elephant-in-snake eyes flaming-sheep ghostbusters
head-in hellokitty kiss kitty koala kosh luke-koala meow milk moofasa moose
mutilated ren satanic sheep skeleton small sodomized stegosaurus stimpy
supermilker surgery telebears three-eyes turkey turtle tux udder vader
vader-koala www
braianet ~ $ cowsay -f ghostbusters Lindo día para hacer un asado eh!
____________________________________
Lindo día para hacer un asado eh!
------------------------------------
\
\
\ __---__
_- /--______
__--( / \ )XXXXXXXXXXX\v.
.-XXX( O O )XXXXXXXXXXXXXXX-
/XXX( U ) XXXXXXX\
/XXXXX( )--_ XXXXXXXXXXX\
/XXXXX/ ( O ) XXXXXX \XXXXX\
XXXXX/ / XXXXXX \__ \XXXXX
XXXXXX__/ XXXXXX \__---->
---___ XXX__/ XXXXXX \__ /
\- --__/ ___/\ XXXXXX / ___--/=
\-\ ___/ XXXXXX '--- XXXXXX
\-\/XXX\ XXXXXX /XXXXX
\XXXXXXXXX \ /XXXXX/
\XXXXXX > _/XXXXX/
\XXXXX--__/ __-- XXXX/
-XXXXXXXX--------------- XXXXXX-
\XXXXXXXXXXXXXXXXXXXXXXXXXX/
""VXXXXXXXXXXXXXXXXXXV""

braianet ~ $ cowsay -f meow Poder Linux!
______________
Poder Linux!
--------------
\
\ , _ ___.--'''`--''//-,-_--_.
\`"' ` || \\ \ \\/ / // / ,-\\`,_
/'` \ \ || Y | \|/ / // / - |__ `-,
/@"\ ` \ `\ | | ||/ // | \/ \ `-._`-,_.,
/ _.-. `.-\,___/\ _/|_/_\_\/|_/ | `-._._)
`-'``/ / | // \__/\__ / \__/ \
`-' /-\/ | -| \__ \ |-' |
__/\ / _/ \/ __,-' ) ,' _|'
(((__/(((_.' ((___..-'((__,'
braianet ~ $

Para instalarlo en Arch:

pacman -S cowsay

Fortune es un programa que al azar muestra un adagio o dicho, algunos suelen ser muy divertidos, hay de todo, de tecnología, política, cultura, humor, etc. Casi todas las distros actuales lo incluyen, y simplemente mándalo llamar de escribiendo fortune, veamos algunos ejemplos:

braianet ~ $ fortune
Una palabra mal colocada estropea el más bello pensamiento.
-- Francois Marie Arouet
.
braianet ~ $ fortune
El que ambiciona lo ajeno, pronto pierde lo propio.
braianet ~ $ fortune
No cabe duda, la diferencia entre un niño y un hombre es tan solo el
tamaño y el costo de sus juguetes.
-- Don Atello. Internaut.

braianet ~ $ fortune
Los refranes no engañan a nadie.
braianet ~ $ fortune
El dinero se inventó para que sepamos exactamente cuanto debemos.
-- Cullen Hightower.

braianet ~ $

Para instalar fortune en Arch

pacman -S fortune-mod

Si colocamos en pacman:

pacman -Ss fortune-mod

nos mostrará una enorme colección para instalar. Pero están todos en inglés....
Como no quise en inglés, busqué en español y los encontré en el repositorio de debian, descargar comprimido.
Acontinuación y lo descomprimen y se ubican en la carpeta datfiles.

$ tar xvzf fortunes-es_1.28.tar.gz
$ cd fortunes-es-1.28/datfiles/

En él encontraran un fichero que se llama Makefile. Lo abren y modifican la siguiente línea.

STRFILE=/usr/bin/strfile

Por

STRFILE=/usr/sbin/strfile

Ahora nos queda generar los archivos .dat que son para que fortune los lea.

$ make

Copiamos todo el contenido del directorio al de fortune. (como root)

# cp -r * /usr/share/fortune/

Y verificamos

root ~ # fortune
Comer sin vino es miseria o desatino.
root ~ #

Cowsay dice fortunes

Combinemos ahora ambos programas a través de un pipe '|'.

root ~ #  fortune | cowsay

__________________________________
/ Ignorar para preguntar, y preguntar \
\ para saber, eso es aprender. /
-------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
root ~ #

Conociendo lo anterior, presento entonces el siguiente script (saludo.sh) que selecciona una figura al azar de cowsay y lo combina con fortune.

#!/bin/bash
################################################################################################################
# Copyright 2005-2008 Sergio González Durán (sergon@linuxtotal.com.mx)
# Se concede permiso para copiar, distribuir y/o modificar este programa siempre y cuando se cite al autor y la
# fuente de linuxtotal.com.mx y según los términos de la GNU General Public License, Versión 3 o cualquiera
# posterior publicada por la Free Software Foundation.
################################################################################################################

# archivos de figuras de cowsay en un arreglo
vacas=(`ls /usr/share/cows`)

# total de figuras encontradas (elementos en el arreglo)
TVACAS=${#vacas[*]}

# selecciona un numero al azar entre 0 y TVACAS
NVACA=$((RANDOM%$TVACAS))

# nombre del archivo cowsay a utilizar
vaca=${vacas[$NVACA]}

# forma el saludo con fortune y cowsay
fortune | cowsay -f $vaca


Luego ejecutarlo:

braianet ~/Desktop $ ./saludo.sh
________________________________________
/ Los viejos agricultores nunca mueren, \
\ simplemente les toca abonar la tierra. /
----------------------------------------
\
\ \
\ /\
( )
.( o ).
braianet ~/Desktop $


Abrimos ~/.bashrc y agregamos al final "saludo.sh". Cada vez que abramos una terminal, saldrá una figura con una frase :).

Saludos!

Referencia:
http://www.linuxtotal.com.mx/index.php?cont=info_shell_004