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.