Je me dis même qu'avec le script ce serait mieux ...
C'est basé sur la commande smbclient
Bonne chance !
#!/usr/bin/perl -w
# Script de recherche de partages sur le rézo
# Largement inspiré du script de gluck pour windows.
# (C) Nicolas Deslandes Octobre 2002
use DBI;
use locale;
sub AnaMachine;
sub AddPartage;
$mainserver = "JABBA"; # Nom du controleur de domaine
$cptlog = "-U kekya\%[ldWemvldS\\!] -N";
my $dbh = DBI->connect("DBI:mysql:rezo:yoda", "user", "mdp")
or die "Impossible de se connecter à la base de données";
open MACHINES,"smbclient -L $mainserver $cptlog|";
my $started = 0; # On ne commence pas tout de suite à lire les lignes
my $firstemptyline = 1;
while()
{
# On saute les premières lignes inutiles
next unless ($started or /Server.*Comment/);
if (!$started)
{
$started = 1;
next;
}
next if /-{9}\s+-{7}/; # On saute la ligne de soulignement
# Si la ligne est vide, on arrête
last if (/^$/);
if(/\W+(.+?)\ {4,}/) {AnaMachine(1ドル);}
}
close MACHINES;
exit;
sub AnaMachine
{
my $machine = shift;
# On regarde si la mise à jour de la machine est nécessaire
# remplacement des apostrophes pour SQL
(my $machineSQL = $machine) =~ s/'/''/g;
my $dateMAJ = $dbh->selectrow_array("SELECT date FROM PartagesMAJ WHERE machine='$machineSQL'");
#construction de la date courante
my @temp = localtime();
my $date = $temp[5] + 1900;
$date .= '-'.($temp[4]+1).'-'.($temp[3]);
$date =~ s/-(\d)-/-01ドル-/;
$date =~ s/-(\d)$/-01ドル/;
# Si la dateMAJ est définie, on la compare à la date courante,
# sinon, on poursuit l'analyse de la machine
if( defined $dateMAJ)
{
$dateMAJ =~ s/ 00:00:00$//;
if($dateMAJ eq $date)
{
# Cas où on n'a rien à faire : on n'affiche rien à l'écran
return;
}
}
print "Mise à jour de $machine...";
# On commence par regarder si la machine est online
my $machineSH = $machine;
$machineSH =~ s/!/\\!/g;
$machineSH =~ s/'/\\'/g; # Ne semble pas marcher
if(`smbclient -L $machineSH $cptlog | grep Connection` =~ /failed/)
{
#mettre à jour '$partageMAJ'
print " offline; on essaiera plus tard\n";
$dbh->do("UPDATE PartagesMAJ SET upState='0' WHERE machine='$machineSQL'");
return;
}
else
{
#mettre à jour 'partageMAJ'
print "\n";
# On commence par effacer les entrées de la base liées à cette machine
unless($dbh->do("DELETE FROM Partages WHERE machine='$machineSQL'"))
{
print "Impossible de supprimer les entrées de la base de données pour $machine\n";
return;
}
open(LIST,"smbclient -L \"$machine\" $cptlog|");
my $started = 0;
my $ip = 0;
while()
{
#print "Ligne : $_";
if (/Got a positive name query response from (.*?)\s/) {
$ip = 1ドル;
# IP incorrecte : loopback; on passe à la machine suivante
next if $ip eq "127.0.0.1";
}
# On atteint d'abord les "----"
next unless $started or /-{9}\s+-/;
if (!$started)
{
$started = 1;
next;
}
# Si on rencontre une ligne vide, on sort
last if /^$/;
if(/\s+(.+?)\s+Disk/)
{
# Si le nom du partage finit par '$', on passe au suivant
next if 1ドル =~ /\$$/;
# Sinon, on ajoute le partage à la base de données
AddPartage($machine,1ドル);
}
}
close(LIST);
# $machine a été analysée; on met à jour PartagesMAJ;
# Modification de la date : on supprime tous les caractères non numériques
$date =~ s/\D//g;
unless(($dbh->do("UPDATE PartagesMAJ SET date=$date, upState='1', ip='$ip' WHERE machine='$machineSQL'") eq 1)
or ($dbh->do("INSERT INTO PartagesMAJ VALUES ('$machineSQL', '$date', '$ip', '1')") eq 1) )
{
print "Erreur recontrée durant la mise à jour de la date de $machine\n";
return;
}
}
sub AddPartage
{
my $machine = shift;
my $partage = shift;
open(LISTFICH, "(echo recurse && echo ls) | smbclient \"//$machine/$partage\" $cptlog|");
while()
{
next unless (/^\ {2}(.+?)\s+([DAHRS]*)\s+(\d+)\s*[a-zA-Z]{3}\s[a-zA-Z]{3}/ or /^(\\.+)$/);
next if((defined 2ドル) and (2ドル =~ /[DH]/) ); # si on détecte un attribut répertoire ou caché, on passe à la ligne suivante
# (les réperoires sont détectés grâce à 3ドル)
if(!defined 3ドル)
{
# Répertoire détecté : On met à jour le répertoire courant
next if 1ドル =~ /^\.{1,2}/; # On saute les répertoire '.' et '..'
$currep = 1ドル;
# On modifie un peu ce qu'on a obtenu
$currep .= '\\';
$currep =~ s/\\/\\\\/g;
$currep =~ s/'/''/g;
}
else
{
# Fichier
my $nomfichcomplet = 1ドル;
my $taille = 3ドル;
my $nomf;
my $extf; if ($nomfichcomplet =~ /(.+)\.(.+)/)
{
$nomf=1ドル;
$extf=2ドル;
}
else
{
$nomf=$nomfichcomplet;
$extf="";
}
$nomf =~ s/'/''/g;
$extf =~ s/'/''/g;
unless($dbh->do("INSERT INTO Partages VALUES "
."('$machineSQL','$partageSQL','$currep','$nomf','$extf',$taille)"))
{
print "Impossible d'insérer le fichier \\\\$machine\\$partage$currep\\$nomf.$extf : $taille;\n";
}
}
}
close LISTFICH;
}
}
[^] # Re: Tu peux le créer toi même ....
Posté par Colin Pitrat (site web personnel) . En réponse au journal un "LanFileSearch" pour Linux ?. Évalué à 9.
C'est basé sur la commande smbclient
Bonne chance !
#!/usr/bin/perl -w
# Script de recherche de partages sur le rézo
# Largement inspiré du script de gluck pour windows.
# (C) Nicolas Deslandes Octobre 2002
use DBI;
use locale;
sub AnaMachine;
sub AddPartage;
$mainserver = "JABBA"; # Nom du controleur de domaine
$cptlog = "-U kekya\%[ldWemvldS\\!] -N";
my $dbh = DBI->connect("DBI:mysql:rezo:yoda", "user", "mdp")
or die "Impossible de se connecter à la base de données";
open MACHINES,"smbclient -L $mainserver $cptlog|";
my $started = 0; # On ne commence pas tout de suite à lire les lignes
my $firstemptyline = 1;
while()
{
# On saute les premières lignes inutiles
next unless ($started or /Server.*Comment/);
if (!$started)
{
$started = 1;
next;
}
next if /-{9}\s+-{7}/; # On saute la ligne de soulignement
# Si la ligne est vide, on arrête
last if (/^$/);
if(/\W+(.+?)\ {4,}/) {AnaMachine(1ドル);}
}
close MACHINES;
exit;
sub AnaMachine
{
my $machine = shift;
# On regarde si la mise à jour de la machine est nécessaire
# remplacement des apostrophes pour SQL
(my $machineSQL = $machine) =~ s/'/''/g;
my $dateMAJ = $dbh->selectrow_array("SELECT date FROM PartagesMAJ WHERE machine='$machineSQL'");
#construction de la date courante
my @temp = localtime();
my $date = $temp[5] + 1900;
$date .= '-'.($temp[4]+1).'-'.($temp[3]);
$date =~ s/-(\d)-/-01ドル-/;
$date =~ s/-(\d)$/-01ドル/;
# Si la dateMAJ est définie, on la compare à la date courante,
# sinon, on poursuit l'analyse de la machine
if( defined $dateMAJ)
{
$dateMAJ =~ s/ 00:00:00$//;
if($dateMAJ eq $date)
{
# Cas où on n'a rien à faire : on n'affiche rien à l'écran
return;
}
}
print "Mise à jour de $machine...";
# On commence par regarder si la machine est online
my $machineSH = $machine;
$machineSH =~ s/!/\\!/g;
$machineSH =~ s/'/\\'/g; # Ne semble pas marcher
if(`smbclient -L $machineSH $cptlog | grep Connection` =~ /failed/)
{
#mettre à jour '$partageMAJ'
print " offline; on essaiera plus tard\n";
$dbh->do("UPDATE PartagesMAJ SET upState='0' WHERE machine='$machineSQL'");
return;
}
else
{
#mettre à jour 'partageMAJ'
print "\n";
# On commence par effacer les entrées de la base liées à cette machine
unless($dbh->do("DELETE FROM Partages WHERE machine='$machineSQL'"))
{
print "Impossible de supprimer les entrées de la base de données pour $machine\n";
return;
}
open(LIST,"smbclient -L \"$machine\" $cptlog|");
my $started = 0;
my $ip = 0;
while()
{
#print "Ligne : $_";
if (/Got a positive name query response from (.*?)\s/) {
$ip = 1ドル;
# IP incorrecte : loopback; on passe à la machine suivante
next if $ip eq "127.0.0.1";
}
# On atteint d'abord les "----"
next unless $started or /-{9}\s+-/;
if (!$started)
{
$started = 1;
next;
}
# Si on rencontre une ligne vide, on sort
last if /^$/;
if(/\s+(.+?)\s+Disk/)
{
# Si le nom du partage finit par '$', on passe au suivant
next if 1ドル =~ /\$$/;
# Sinon, on ajoute le partage à la base de données
AddPartage($machine,1ドル);
}
}
close(LIST);
# $machine a été analysée; on met à jour PartagesMAJ;
# Modification de la date : on supprime tous les caractères non numériques
$date =~ s/\D//g;
unless(($dbh->do("UPDATE PartagesMAJ SET date=$date, upState='1', ip='$ip' WHERE machine='$machineSQL'") eq 1)
or ($dbh->do("INSERT INTO PartagesMAJ VALUES ('$machineSQL', '$date', '$ip', '1')") eq 1) )
{
print "Erreur recontrée durant la mise à jour de la date de $machine\n";
return;
}
}
sub AddPartage
{
my $machine = shift;
my $partage = shift;
(my $machineSQL = $machine) =~ s/'/''/g;
(my $partageSQL = $partage) =~ s/'/''/g;
my $currep = "\\\\";
open(LISTFICH, "(echo recurse && echo ls) | smbclient \"//$machine/$partage\" $cptlog|");
while()
{
next unless (/^\ {2}(.+?)\s+([DAHRS]*)\s+(\d+)\s*[a-zA-Z]{3}\s[a-zA-Z]{3}/ or /^(\\.+)$/);
next if((defined 2ドル) and (2ドル =~ /[DH]/) ); # si on détecte un attribut répertoire ou caché, on passe à la ligne suivante
# (les réperoires sont détectés grâce à 3ドル)
if(!defined 3ドル)
{
# Répertoire détecté : On met à jour le répertoire courant
next if 1ドル =~ /^\.{1,2}/; # On saute les répertoire '.' et '..'
$currep = 1ドル;
# On modifie un peu ce qu'on a obtenu
$currep .= '\\';
$currep =~ s/\\/\\\\/g;
$currep =~ s/'/''/g;
}
else
{
# Fichier
my $nomfichcomplet = 1ドル;
my $taille = 3ドル;
my $nomf;
my $extf; if ($nomfichcomplet =~ /(.+)\.(.+)/)
{
$nomf=1ドル;
$extf=2ドル;
}
else
{
$nomf=$nomfichcomplet;
$extf="";
}
$nomf =~ s/'/''/g;
$extf =~ s/'/''/g;
unless($dbh->do("INSERT INTO Partages VALUES "
."('$machineSQL','$partageSQL','$currep','$nomf','$extf',$taille)"))
{
print "Impossible d'insérer le fichier \\\\$machine\\$partage$currep\\$nomf.$extf : $taille;\n";
}
}
}
close LISTFICH;
}
}