historia.sh

Script que usa el interprete de perl, para divisar la actividad de los usuario en el sistema. Básicamente usa el .sh_history para presentar la información mas ordenada (mejora el timestamp), ademas usando la flag -u el root tiene la opcion de ver la actividad (comandos) de los demás usuario sin tener que auditar el archivo de log de cada usuario.

Formato:

# historia -u xediaz

Fichero de historia: /home/xediaz/.sh_history

22-03-2013 11:28:00 ..cd /mnt

22-03-2013 11:28:01 ls

22-03-2013 11:28:03 ls -l

22-03-2013 11:28:15 du -m sapnodo2dbkp

22-03-2013 11:29:56 su -

01-04-2013 14:02:25 cat /etc/hosts

01-04-2013 14:08:08 ping w2k3-iis1

01-04-2013 14:08:45 ping w2k8-iis1

01-04-2013 14:08:53 su -

10-04-2013 15:03:29 df

10-04-2013 15:15:20 ps

10-04-2013 15:15:24 ps -ef

10-04-2013 15:15:39 cat /etc/inittab

10-04-2013 15:16:28 ps -ef

10-04-2013 15:56:35 man alias

10-04-2013 15:59:45 ps

10-04-2013 15:59:50 alias -t ps

Script:

# cat /usr/bin/historia

#!/usr/bin/perl

# Invocacion:

# historia [-u <usuario>]

# Solo root puede usar la bandera ``-u''.

use Getopt::Std;

use POSIX;

# Cantidad de argumentos, es 0 si no hay ninguno (el nombre del programa no juega,

# al contrario que en C y C++.

my $cant_args = @ARGV;

# Averiguar el nombre de suario con que estoy corriendo

local $uid=getuid();

local $login;

local $passwd;

local $gid;

local $gcos;

local $shell;

local $home=$ENV{HOME};

local $hist_file;

if ($uid == 0)  # Soy root

{

        if ($cant_args > 0)     # Tomar el nombre de usuario de la linea de comandos en $opt_u.

        {

                # Averiguar que usuario es y cual es su homedir

                getopt('u');

                open(PWFILE, "/etc/passwd") || die "No se pudo abrir el fichero /etc/passwd para lectura: $!\n";

                # Buscar el usuario y obtener sus datos

                while (<PWFILE>)

                {

                        chomp;

                        if (/$opt_u/)

                        {

                                ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(/:/);

                                last;   # terminar bucle, como break en C/C++

                        }       # if

                }       # while

                close(PWFILE);

                $hist_file="$home/.sh_history";

        }

        else

        {

                $hist_file="/.sh_history";

        }

}

else    # No soy root

{

        if ($cant_args > 0)

        {       # No puede invocar para otro usuario, morir.

                die "Solo ``root'' puede usar parametros.\n"

        }

        else

        {

                # Abrir el fichero de historia, salir si no existe.

                $hist_file="$home/.sh_history";

        }

}

print "Fichero de historia: $hist_file\n";

open(HIST, "<$hist_file") || die "No se pudo abrir $hist_file para lectura: $!\n";

# Existen el homedir y el fichero de historia.

# Procesar la historia linea por linea.

while (<HIST>)

{

        chomp ($_);

        my $l = length($_);

        my $com = substr($_, 0, ($l-16) );

        #my $com = substr($_, 0, $l);

        my $fec = substr($_, ($l -13),10 );

        my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($fec);

        my $str = sprintf "%02d-%02d-%4d %02d:%02d:%02d", $mday, $mon+1, $year+1900, $hour, $min, $sec;

        print "$str $com \n";

}

close(HIST);

print "$hist_file\n";

Tip:

Luego generar el srcipt hacer un enlace desde donde lo tangamos para dejarlo accesible en el path de todos los usuarios:

# ls -l /usr/bin/histo*

lrwxrwxrwx    1 root     system           27 Jun 29 2011  /usr/bin/historia -> /opt/scripts/utils/historia

Como hacer el link simbólico:

/usr/bin/# ln -s /opt/scripts/utils/historia historia

En este caso estamos haciendo un link simbólico en el directorio en el cual estamos parados.