IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[perl 5.26][Array/Hash/Map] Script pour éditer /etc/hosts


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut [perl 5.26][Array/Hash/Map] Script pour éditer /etc/hosts
    Bonjour,

    Je suis en train de tenter quelque chose avec mes élèves.
    Nous sommes dans une classe où règne Microsoft et donc où nous ne savons pas travailler.
    Impossible d'éditer /etc/hosts (Windows\system32\drivers\etc) par manque de droits suffisants, et pour l'apprentissage du Web dynamique on est un peu mal.
    Et pour la liste DNS pour chaque poste c'est pareil on ne peut pas la modifier.

    J'ai donc mon portable avec Apache, bind9/named, etc... permettant d'heberger les sites de mes élèves.
    J'ai créé un script bash qui permet (un peu comme Wamp) en une ligne de commande de créer autant d'hôtes virtuels avec les dossiers "squelettes" pour les sites en modifiant le contenu des fichiers "vhost.template".

    Maintenant, dans un premier temps, j'aimerais créer un script perl, il me semble que c'est le meilleur langage pour ce genre de traitement de données qui me permettrait de "mettre de l'ordre" dans le fichier /ec/hosts.
    Vu que la liste DNS n'est pas encore modifiée au niveau de la classe, l'administrateur ne m'a pas encore répondu à ce sujet, je dois passer par le /etc/hosts de mon système pour "résoudre les noms de domaines".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    use strict;
    use warnings;
     
    use experimental 'smartmatch';
     
    my @ipaddresses = ('');
     
    my $targetfile="/etc/hosts";
     
    my $ipentry="";
    my @domains = ('');
     
    open(my $descripteur,'<:encoding(UTF-8)', $targetfile) or die "$targetfile not found :{";
     
    while(my $ligne = <$descripteur>)  # tant que nous ne sommes pas arrivés à la fin du fichier
    {
    	chomp $ligne;				# on enlève le caractère '\n' de fin de ligne
     
    	if($ligne =~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/)
    	{
    		($ipentry,@domains)=split('\s{1,}|\t',$ligne); # on "splitte" à un ou plusieurs espaces ou à une tabulation
     
    		if(!($ipentry ~~ @ipaddresses))
    		{
    			print "IP trouvée --> $ipentry \n";
     
    			push(@ipaddresses,$ipentry);
    		}
    	}
    }
    J'aimerais créer un "hash" ou "map" avec une clef (adresse IP) et un ou plusieurs domaines.
    Est-ce possible en perl ou dois-je passer par MySQL ?

    Instinctivement je ferais ceci mais je n'arrive pas à parcourir le tableau de domaines par la suite...

    A la lecture du fichier j'obtients le tableau @domains via le split.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    my %hashEntries=('');
     
    if(!$ipentry ~~ $hashEntries{$ipentry}) $hashEntries{$ipentry}=[ @domains ]; # si je mets @domains sans les crochets j'ai le nombre d'éléments au lieu de la référence du tableau HASH[...].
    else
    {
     # c'est ici que je n'arrive pas à "pusher" les domaines à ceux qui existent déjà
     my @existingDomains=$hashEntries{$ipentry};
     
    }
    Pourriez-vous m'éclairer sur ce sujet ?
    [EDIT]
    Oui, le fichier /etc/hosts à la lecture de ses lignes, risque de contenir plusieurs fois une certaine adresse IP, par exemple 127.0.0.6 pourrait apparaître trois ou quatre fois avec des domaines différents (en nombre aussi)...
    127.0.0.6 www.test1.ecole.be
    ...
    ...
    ...
    127.0.0.6 www.test2.ecole.be test3 test4
    ...
    ...
    127.0.0.6 www.test5.ecole.be
    Le but du jeu serait de "refondre" un /etc/hosts avec une seule ligne pour 127.0.0.6 avec tous les domaines trouvés à la lecture de celui-ci.

    1. je parcoure /etc/hosts
    2. je lis chaque ligne et détecte si il s'agit d'une IPv4
    3. je lie une adresse IP avec une liste de domaines (au lieu de map dans le titre j'aurais dû mettre lists)
    4. si je retrouve la même ip j'ajoute les domaines à ceux de la liste correspondant à la clef représentée par l'adresse IP
    5. je renomme le fichier /etc/hosts
    6. je relis le fichier renommé et dès que je trouve une ipv4 je ne recopie pas la ligne dans /etc/hosts
    7. une fois la fin du fichier renommé atteinte j'écris les lignes contenant l'adresse IP et les domaines liés dans /etc/hosts

  2. #2
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    En relisant et en essayant de comprendre le post Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    use strict;
    use warnings;
     
    use experimental 'smartmatch';
    use Data::Dump 'dump';
     
    my @ipaddresses = ('');
     
    my $targetfile="/etc/hosts";
     
    my $ipentry="";
    my @domains = ('');
     
    my %hashEntries=('');
     
     
    open(my $descripteur,'<:encoding(UTF-8)', $targetfile) or die "$targetfile not found :{";
     
    while(my $ligne = <$descripteur>) 			# tant que nous ne sommes pas arrivés à la fin du fichier
    {
    	chomp $ligne;													# on enlève le caractère '\n' de fin de ligne
     
    	if($ligne =~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/)
    	{
    		($ipentry,@domains)=split('\s{1,}|\t',$ligne);									# on "splitte" à un ou plusieurs espaces ou à une tabulation
     
    		if(!($ipentry ~~ @ipaddresses))
    		{
    			print "IP trouvée --> $ipentry \n";
    			$hashEntries{$ipentry} = [ "@domains" ];
     
    		}
    	}
    }
     
    print dump(%hashEntries)."\n";
     
    #my @domainnames = (@ipaddresses);
    #print "Elements dans \@domainnames: ".(@domainnames-1)."\n";
     
    close($descripteur);
    J'obtiens au moins les valeurs dumpées je vais voir quand je fais un simple print ce que cela donne... mais je pense avoir saisi le principe...

  3. #3
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Voilà où je coince...

    sirius:/utilitaires/perl/2023/apachehelper # ./apachehelper.pl
    IP trouvée --> 127.0.0.1
    IP trouvée --> 127.0.0.2
    IP trouvée --> 127.0.0.5
    IP trouvée --> 127.0.0.3
    IP trouvée --> 127.0.0.4
    IP trouvée --> 127.0.0.6
    IP trouvée --> 127.0.0.254
    [Add] Nombre d'éléments: ARRAY(0x555a66a4e7e8)
    [Add] Nombre d'éléments: ARRAY(0x555a66a4e7e8) test.com test2.com test3.com
    (
    "127.0.0.3",
    ["server.mysql.dezordi.world"],
    "127.0.0.1",
    ["localhost"],
    "127.0.0.5",
    ["www.server.dezordi.world"],
    "127.0.0.4",
    ["www.memory.dezordi.world"],
    "127.0.0.2",
    ["www.secureserver.dezordi.world"],
    "127.0.0.6",
    ["www.examendecembre.uaa12.test"],
    "127.0.0.254",
    ["www.exercicePHP3.test"],
    )
    [After no dump] Test -> ARRAY(0x555a66a4e7e8)
    Je pense que si je ne sais pas faire de print (je maîtrise pas trop le dump) je ne saurais pas écrire dans un fichier donné... et puis le dump formatte les données bizaremment et ne convient pas pour /etc/hosts.
    Ici j'ai du mal à ajouter des éléments à une liste déjà existante...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    use strict;
    use warnings;
     
    use experimental 'smartmatch';
    use Data::Dump 'dump';
     
    my @ipaddresses = ('');
     
    my $targetfile="/etc/hosts";
     
    my $ipentry="";
    my @domains = ('');
     
    my %hashEntries;
     
     
    open(my $descripteur,'<:encoding(UTF-8)', $targetfile) or die "$targetfile not found :{";
     
    while(my $ligne = <$descripteur>) 			# tant que nous ne sommes pas arrivés à la fin du fichier
    {
    	chomp $ligne;													# on enlève le caractère '\n' de fin de ligne
     
    	if($ligne =~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/)
    	{
    		($ipentry,@domains)=split('\s{1,}|\t',$ligne);									# on "splitte" à un ou plusieurs espaces ou à une tabulation
     
    		if(!($ipentry ~~ @ipaddresses))
    		{
    			print "IP trouvée --> $ipentry \n";
    			$hashEntries{$ipentry} = [ "@domains" ];
    			push(@ipaddresses,$ipentry);
    		}
    		else
    		{
    			my @temp=$hashEntries{$ipentry};
    			print "[Add] Nombre d'éléments: @temp\n";
    			push(@temp,@domains);
    			print "[Add] Nombre d'éléments: @temp\n";
     
    		}
    	}
    }
     
    print dump(%hashEntries)."\n";
    print "[After no dump] Test -> ".$hashEntries{'127.0.0.6'}."\n";
     
    close($descripteur);

  4. #4
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Voilà au moins quelque chose maintenant je ne sais pas comment accéder au contenu du hash...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    while(my $ligne = <$descripteur>) 			
    {
    	chomp $ligne;													
     
    	if($ligne =~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/)
    	{
    		($ipentry,@domains)=split('\s{1,}|\t',$ligne);									
     
    		if(!($ipentry ~~ @ipaddresses))
    		{
    			print "IP trouvée --> $ipentry \n";
    			$hashEntries{$ipentry} = [ "@domains" ];
    			push(@ipaddresses,$ipentry);
    		}
    		else
    		{
    			my @temp=$hashEntries{$ipentry};
    			print "[Add] Nombre d'éléments: @temp\n";
    			push(@temp,[@domains]);
     
    			$hashEntries{$ipentry} = [@temp];
    			print "[Add] Nombre d'éléments: @temp\n";
     
    		}
    	}
    }
    Output qui me paraît intéressant:

    sirius:/utilitaires/perl/2023/apachehelper # ./apachehelper.pl
    IP trouvée --> 127.0.0.1
    IP trouvée --> 127.0.0.2
    IP trouvée --> 127.0.0.5
    IP trouvée --> 127.0.0.3
    IP trouvée --> 127.0.0.4
    IP trouvée --> 127.0.0.6
    IP trouvée --> 127.0.0.254
    [Add] Nombre d'éléments: ARRAY(0x555f403217e8)
    [Add] Nombre d'éléments: ARRAY(0x555f403217e8) ARRAY(0x555f403220a0)
    (
    "127.0.0.6",
    [
    ["www.examendecembre.uaa12.test"],
    ["test.com", "test2.com", "test3.com"],
    ],
    "127.0.0.2",
    ["www.secureserver.dezordi.world"],
    "127.0.0.3",
    ["server.mysql.dezordi.world"],
    "127.0.0.254",
    ["www.exercicePHP3.test"],
    "127.0.0.1",
    ["localhost"],
    "127.0.0.4",
    ["www.memory.dezordi.world"],
    "127.0.0.5",
    ["www.server.dezordi.world"],
    )
    [After no dump] Test -> ARRAY(0x555f403411f8)
    J'aimerais pouvoir parcourir le hash et constituer quelque chose comme


  5. #5
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach my $key (keys %hashEntries)
    {
    	my @temp=$hashEntries{$key};
    	print "[After no dump] Test 2 $key -> @temp\n";
    }
    J'arrive pas à faire comprendre à Perl que @temp n'est pas l'adresse du tableau mais les éléments à afficher lol ^^

  6. #6
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Avec ceci j'y suis presque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    foreach my $key (keys %hashEntries)
    {
    	my @temp=$hashEntries{$key};
     
    	#print "Elements: ".@temp."\t";
     
    	print "[After no dump] Test 2 $key ->\t";
    	foreach my $element (@temp)
    	{	
    		if($element ~~ /ARRAY/)
    		{
    			print "Array détecté...\t";
    			foreach my $autreelement (@$element)
    			{
    					print "[@$autreelement]\n";
    			}
    		}
    		print "[@$element]\n";
    	}
    }
    Mais encore une fois il m'est impossible avec mes connaissances actuelles de Perl de "détecter qu'il s'agit d'une liste/array" et du coup je suis obligé de faire des "workarounds" bancaux ^^
    sirius:/utilitaires/perl/2023/apachehelper # ./apachehelper.pl
    IP trouvée --> 127.0.0.1
    IP trouvée --> 127.0.0.2
    IP trouvée --> 127.0.0.5
    IP trouvée --> 127.0.0.3
    IP trouvée --> 127.0.0.4
    IP trouvée --> 127.0.0.6
    IP trouvée --> 127.0.0.254
    [Add] Nombre d'éléments: ARRAY(0x5598af4ebef0)
    [Add] Nombre d'éléments: ARRAY(0x5598af4ebef0) ARRAY(0x5598af50f928)
    (
    "127.0.0.254",
    ["www.exercicePHP3.test"],
    "127.0.0.6",
    [
    ["www.examendecembre.uaa12.test"],
    ["test.com", "test2.com", "test3.com"],
    ],
    "127.0.0.5",
    ["www.server.dezordi.world"],
    "127.0.0.2",
    ["www.secureserver.dezordi.world"],
    "127.0.0.1",
    ["localhost"],
    "127.0.0.4",
    ["www.memory.dezordi.world"],
    "127.0.0.3",
    ["server.mysql.dezordi.world"],
    )
    [After no dump] Test 2 127.0.0.254 -> [www.exercicePHP3.test]
    [After no dump] Test 2 127.0.0.6 -> Array détecté... [www.examendecembre.uaa12.test]
    [test.com test2.com test3.com]
    [ARRAY(0x5598af4ebef0) ARRAY(0x5598af50f928)] /!\ AU SECOURS /!\ COMMENT CA APPARAIT DANS LA LISTE ?????
    [After no dump] Test 2 127.0.0.5 -> [www.server.dezordi.world]
    [After no dump] Test 2 127.0.0.2 -> [www.secureserver.dezordi.world]
    [After no dump] Test 2 127.0.0.1 -> [localhost]
    [After no dump] Test 2 127.0.0.4 -> [www.memory.dezordi.world]
    [After no dump] Test 2 127.0.0.3 -> [server.mysql.dezordi.world]

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/10/2017, 11h59
  2. [MySQL] Concept d'un script pour chercher des villes ou des régions (A la Google Map)
    Par cool-man dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/08/2010, 10h29
  3. Script pour modifier fichier "host"
    Par chuispasla dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 05/08/2009, 14h03
  4. [langage] perl script pour balancer un B-arbre
    Par RonMaster dans le forum Langage
    Réponses: 5
    Dernier message: 22/10/2004, 17h35
  5. Script pour envoyer des info a mysql
    Par rhum1 dans le forum Linux
    Réponses: 6
    Dernier message: 15/04/2003, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo