viernes, 15 de mayo de 2009

Logs

Linux ofrece algunos comandos que permiten a los administradores tener acceso a los archivos de Log. Dos comandos de interes son last y lastlog.
El comando last muestra datos como quien esta logeado en el sistema, quien se logeo recientemente, y cuando el sistema ha sido rebooteado. Por ejemplo:
root tty1     Fri May 25 13:53  still logged on
frank pts/0 209.113.84.112 Fri May 25 12:13 14:36 (02:22)
reboot system boot 2.2.12-20 Fri May 25 12:06 (04:18)

El comando lastlog muestra los usuarios y servicios que tienen una cuenta en el sistema. Tambien lista la ultima vez que cada cuenta ha sido utilizada, o si a sido utilizada alguna vez. Cada
servicio de Linux tiene una cuenta asociada. Esto es muy util porque si una servicio se ha logeado sin concentimiento, entonces puede ser debido a la accion de un hacker. Podria indicar que un hacker controla el sistema, o que otro administrador inicio en servicio.
El archivo "messages" contiene la actividad reciente del sistema. Por ejemplo, los ultimos cambios de password y quien lo ha hecho. Tambien identifica los usuarios que han habierto o cerrado sesiones de trabajoy tiemo e informacion de los eventos que han sucedido en el sistema. Puede ser visto con el comando:

$ cat /var/log/messages

Moviéndonos por el disco

Listando archivos

La orden básica es:

$ ls

aunque es posible que al escribirlo no pase nada, ya que el directorio donde estamos puede estar vacío. Este comando tiene opciones muy interesantes, aunque las mas útiles son

$ ls -a # para ver los archivos ocultos.
$ ls -l # para ver los datos de los archivos, tamaño, permisos.
$ ls --color # para ver los archivos en colores según
# sean ejecutables, directorios, archivos comprimidos

Cambiando de directorio

La orden básica es

$ cd /directorio

los directorios se referencian con "/" y no con "\" como pasa en MS-DOS. Existen una serie de palabras clave para acelerar el uso del comando cd:

$ cd ~ # nos lleva al directorio raíz de cada usuario,
$ cd .. # baja un directorio,
$ cd / # te sitúa en el archivo raíz del sistema,
$ cd # (sin parámetros) es equivalente a cd ~.

La orden /pwd/ nos indica en que directorio estamos actualmente.

Creando y eliminado directorios

$ mkdir directorio # crea un directorio,
$ rmdir directorio # lo elimina solo si el directorio no contiene nada.

Para eliminar directorios enteros se usa el comando

$rm -rf directorio # ATENCIÓN! este es uno de los
#comandos mas peligrosos para el sistema,
#piensa bien lo que haces antes de ejecutarlo.

Copiar, mover, eliminar archivos

$ cp archivo destino # copia archivo en destino, destino puede ser
# un directorio u otro archivo.
$ mv archivo destino # mueve archivo a destino, el efecto es
#igual al anterior pero eliminando el archivo de origen.
$ rm archivo # elimina archivo.

Opciones interesantes para los tres es -i para confirmar siempre, y -f para forzar la acción. Recomiendo el uso de -i siempre.

Identificando archivos

Estamos acostumbrados a distinguir los archivos por su extensión, pero Linux no impone ninguna restricción a los nombres de los archivos por lo que el archivo "archivo" podría ser tanto un ejecutanle, como un fichero de texto o una foto. Para averiguar el tipo de archivo usaremos el comando

$ file

Este comando busca cadenas especificas dentro de los archivos que determinan su tipo y por tanto el tratamiento que les vamos a dar. Por ejemplo el archivo:

-rw-r--r-- 1 root root 6842843 Jan 16 16:20 linux-2.0.34

No parece tener un formato conocido, aplicamos file:

[root:/usr/src]# file linux-2.0.34 linux-2.0.34: gzip compressed data, deflated, last modified: Thu Jun 4 06:44:55 1998, max compression, os: Unix

Ahora ya sabemos que se trata de un archivo comprimido con gzip y como tratarlo.

Links o Enlaces

Un enlace es una imagen de un archivo o directorio en otra parte del disco, la ventaja de esto es tener accesible un mismo archivo o directorio desde diferentes puntos del árbol de directorios, algo parecido a un acceso directo. La orden básica es

$ ln origen destino

Se pueden linkar tanto archivos como directorios y principalmente con las opciones -s (solo crea un puntero que apunta al origen) y -h (crea imágenes totales del origen).
Por ejemplo, tenemos el directorio /usr/src/linux-2.2.0/ y queremos que el sistema también lo vea como /usr/src/linux/, en este caso el comando seria:

$ ln -s /usr/src/linux-2.2.0 /usr/src/linux/

Buscar archivos

$ find -name archivo

Busca recursivamente el archivo desde el directorio actual. Tiene muchas opciones que pasan por buscar con comodines, por permisos, por fechas de modificación, por propietario, etc.

Viendo archivos

Las ordenes básicas son

$ cat archivo
$ more archivo
$ less archivo

Recomiendo que proveis los tres y veáis cual os gusta mas.
Tambien pueden probar tuberías (prometo escribir otro post sobre el tema), por ejemplo, si tienen demasiados archivos en un directorio como que entren en pantalla con ls pueden probar con:

$ ls | more

Donde el caracter | es un caño (o pipe)

Editando archivos

Esta es una de las operaciones mas comunes dentro del mundo linux, pues casi todo se configura a partir de archivos de texto modificables por el usuario. Hay muchos editores de texto, uno de los más extendidos es vim, aunque también se puede usar nano. En general la mayoría de editores se lanzan con la orden "editor archivo". por ejemplo

$ vim archivo

jueves, 14 de mayo de 2009

Shell Scripts

Se trata de agrupar comandos de consola dentro de un archivo para ejecutarlos secuencialmente. El archivo se convierte en un comando que ejecuta los comandos contenidos en el mismo. De hecho, la consola provee un lenguaje de programación versátil y poderoso; ya que contiene estructuras similares a las que se encuentran en otros lenguages de programación como loops o condicionales. Por lo que, estructurando la secuencia de ejecucion de ciertos comandos dentro de un archivo y dandole permisos de ejecución (con chmod) podemos crear programas para casi cualquier proposito.
Para crear un Shell Script, primero hay que crear un archivo de texto con los comandos en la secuencia que le daríamos si los estuvieramos typeando en la consola. Podemos usar cualquier editor de texto plano. Como gedit en Gnome, o alguno directamente desde la consola: como Nano, Vim o Emacs. En mi caso en particular, me gusta trabajar desde la consola, por lo que estoy aprendiendo a utilizar el editor de texto estructurado Vim, con el objetivo de pasarme a Emacs.
Como ejemplo, crearemos un Shell Script que busque errores en el log del servidor Apache y reporte la cantidad de errores por tipo (las lineas que proceden al simbolo # son comentarios, y no afectan la secuencia del programa).
Con un editor de texto creamos un archivo y lo llamamos "logapchk.sh", dentro de el escribimos lo siguiente:

#!/bin/sh
# La primer linea indica el shell que estamos utilizando.
#
# Este Shell Script busca en el log del apache y genera un reporte
#
# Imprime un mensaje en la salida estandar para informar a
# quien ejecute el programa
que es lo que estamos haciendo

echo "Buscando errores en Apache log ..."
echo ""

# Usamos el comando "grep" para contar (-c) la cantidad de
# lineas que contienen

# la palabra buscada y guardamos el resultado como una variable.

notice='grep -c notice /var/log/apache/error.log'
warning='grep -c warning /var/log/apache/error.log'
error='grep -c error /var/log/apache/error.log'

# damos salida a la pantalla

echo "Cantidad de notices " $notice
echo "Cantidad de warnings "$warning
echo "Cantidad de errores "$error

Luego de crear este archivo le damos permiso de ejecución con

$ chmod u+x logapchk.sh

Ejecutamos el archivo con:

$ logapchk.sh

y deberia aparecer algo como:

Buscando errores en Apache log ...

Cantidad de notices 3
Cantidad de warnings 6
Cantidad de errores 12