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

Programmation et administration système Perl Discussion :

Insertion d'une variable Perl dans une commande SHELL


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut Insertion d'une variable Perl dans une commande SHELL
    Bonjour,

    Je rentre le résultat d'une commande shell dans une scalaire perl. Cette commande SHELL contient elle même une variable perl.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/perl -w
     
    $user=toto;
    $test= `echo $user`;
    print "$test \n";
    Naturellement je travaille sur un script bien plus gros que ce dernier mais le message de warning est le même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unquoted string "toto" may clash with future reserved word at ./test2.pl line 3.
    Merci de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    et ajoute "use strict;" dans ton script

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Philou,

    J'en profite car je suis un peut coincer là ...
    Quel serait l'equivalent de la commande Shell suivante en perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getent passwd | awk 'BEGIN { ORS=""; FS=":"} $3 >= 70000 {print$1" "}'
    Attention ! "cat /etc/passwd" et "getent passwd" ne sont pas pareils, getent introduit les utilisateurs LDAP dans le résultat.
    Je suis newbies j'ai dejà commancé à écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/perl -w
    @user=split (/:/, `getent passwd `); #
    foreach $input ( @user ) {
    print "$input \n";
    }
    Cela a enlevé le ":" mais comment faire le test sur l'UID et en sortir le login.

    Merci de votre aide

  4. #4
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    En fait moi je ferai ceci :
    1)je récupérerait chaque ligne de la commande
    2) pour chaque ligne je partitionnerais suivant les ":"
    3) test sur ton UID (champ 3) et affichage de ton login (champ 1)
    Ce qui donnerait :
    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
     
    #!/usr/bin/perl -w
     
    use strict;
     
    my @users = `getent passwd `;
     
    foreach my $user ( @users ) {
      chomp($user);
      my @split_info_user = split(":",$user);
     
      my $login = $split_info_user[0];
      my $uid = $split_info_user[2];
     
      if($uid > 70000){
        print $login."\n";
      }
    }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Benjou,

    Je vois cela un peut plus clair ..... je l'ai déjà intégrer dans mon script principal
    Cela à l'air de fonctionner sans la "use strict" Ce dernier va me permettre d'envoi des mails automatiques aux utilisateurs abusif.

    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
    #!/usr/bin/perl -w
    # Ce script est configure pour etre utilise par la crontab de "adm"
    use strict;
    use MIME::Lite;
    @hostname=(`hostname`);
    my @users = `getent passwd `;
     
    open(ATTACH, ">/tmp/attach.txt") || die "$!";
            print ATTACH "Attention utilisateur  le serveur @hostname\n";
     
                    foreach $user (@users) {
    			chomp($user);
    			my @split_info_user = split(":",$user);
    			my $login = $split_info_user[0];
    			my $uid = $split_info_user[2];
     
    			  if($uid > 70000){
    				@rate=split(' ',`du -sk /home/$login`);
    				if ($rate[0] > 100000000 ) {
    					$mail=`ldapsearch -h localhost -D cn=proxyuser,ou=pam,dc=exemple,dc=org -w xxxxxx -b ou=People,dc=dc=exemple,dc=org uid=$login | grep mail | sed 's/mail\: //'`;
    					@output=split(' ',`du -sh /home/$user`);
    					print ATTACH "\n Votre repertoire depasse les 100Go merci de verifier :\n";
    					print ATTACH "@output \n\n";
    					close (ATTACH);
     
     
    					#Envoi de l'alerte
    					my $msg = new MIME::Lite
    					From    =>'adm@example.org',
    					To      =>'mdubois@example.org',$mail
    					Subject =>'Avertissement de partion pleine sur @hostname',
    					Type    =>'multipart/mixed';                    
    					attach $msg
    					Type =>'TEXT', 
    					Data =>"Resultat dans le fichier joint"; 
    					attach $msg 
    					Type     =>'TEXT', 
    					Path     =>'/tmp/attach.txt', 
    					Filename =>'/tmp/attach.txt'; 
     
    					$msg-> send;
    					#On efface le fichier  
    					unlink </tmp/attach.txt>;
    				}
    			}
    		}
    C'est du brut de fonderie je suis encore entrain de peaufiner apparemment cela fonctionne
    Encore Merci

  6. #6
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    C'est normal que ton script tel qu'il est ne fonctionne pas avec le pragma use strict : en effet, cela rend, entre autre, obligatoire de déclarer toute variable utilisée pour la première fois avec le mot clé "my". Ensuite tu peux la réutiliser directement.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    use strict;
     
    my $var = "toto";
    $var = "titi";
    En Perl on préconise d'utiliser ce pragma strict ainsi que le "warnings" (appelé dans ton script dans la première ligne par le -w).

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Tiens... je complète ma signature ...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Tiens... je complète ma signature ...
    Tu as raison Philou,

    Je ne savais pas non plus que l'on pouvais mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $user (@user) {


    J'ai encore un message qui revient avant d'avoir un script completement silencieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La première expression régulière ne peut être nulle.
    Est ce quelqu'un sait d'où cela vient ?
    Encore merci

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    A quoi ressemble exactement votre programme actuellement, et quel est le message d'erreur (original) ?

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    A ceci : (il y a eu pas mal de modification depuis le début)
    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
    #!/usr/bin/perl -w
     
    use strict;
    use MIME::Lite;
    my @hostname=(`hostname`);
    my @users = (`ldapsearch -h localhost -D cn=proxyuser,ou=pam,dc=exemple,dc=org -w xxxxx -b ou=
    People,dc=exemple,dc=org uid=* | grep "uid:" | sed 's/uid: //'`);
     
    foreach my $user (@users) {
                    chomp($user);
                    my @rate=split(' ',`du -sk /export/home/$user`);
                    if ($rate[0] > 100000000  ) {
                    open(ATTACH, ">attach.txt") || die "$!";
                    print ATTACH "Attention utilisateur le serveur @hostname vient de verifier ceci : \n";
                    my $mail=`ldapsearch -h localhost -D cn=proxyuser,ou=pam,dc=exemple=org -w xxxxx -b ou=People,dc=exemple,dc=org uid=$user | grep mail | sed 's/mail\: //'`;
                    my @output=split(' ',`du -sh /export/home/$user | sed 's/\/export//'`);
                    print ATTACH "\n Votre repertoire depasse les 100Go merci de verifier :\n";
                    print ATTACH "@output \n\n";
                    print ATTACH " Destinataire : $mail \n";
                    close (ATTACH);
     
     
                    #Envoi de l'alerte
                    my $msg = new MIME::Lite
                    From    =>'adm@exemple.org',
                    To      =>'mdubois@exemple.org',
                    Subject =>'Espace disque du repertoire de travail devient important sur CIM PACA',
                    Type    =>'multipart/mixed';                    
                    attach $msg
                    Type =>'TEXT', 
                    Data =>"Resultat dans le fichier joint"; 
                    attach $msg 
                    Type     =>'TEXT', 
                    Path     =>'attach.txt', 
                    Filename =>'attach.txt'; 
     
                    $msg-> send;
                    #On efface le fichier  
                    unlink <attach.txt>;
            }
    }
    Message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    La première expression régulière ne peut être nulle.
    La première expression régulière ne peut être nulle.
    J'ai l'impression que c'est la génération du fichier attach.txt crée cette erreur, car actuellement j'ai 2 répertoire de travail qui sont à plus de 100Go, et le message s'est répété 2 fois. De plus le résultat du scalaire @output est vide ....

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon, voici votre code remis un peu plus au propre

    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
    48
    49
    50
    51
    52
    53
    54
    #!/usr/bin/perl
    use warnings;
    use strict;
    use MIME::Lite;
    use Sys::Hostname;
    use Socket;
     
    my $hostname = hostname;
     
    my @users = (
      `ldapsearch -h localhost -D cn=proxyuser,ou=pam,dc=exemple,dc=org -w xxxxx -b ou=
    People,dc=exemple,dc=org uid=* | grep "uid:" | sed 's/uid: //'`
    );
     
    foreach my $user (@users) {
      chomp($user);
      my @rate = split( ' ', `du -sk /export/home/$user` );
      if ( $rate[0] > 100000000 ) {
        my $fichier = 'attach.txt';
        open( ATTACH, '>', $fichier ) || die "$fichier : $!";
        print ATTACH "Attention utilisateur le serveur $hostname vient de verifier ceci : \n";
        my $mail
          = `ldapsearch -h localhost -D cn=proxyuser,ou=pam,dc=exemple=org -w xxxxx -b ou=People,dc=exemple,dc=org uid=$user | grep mail | sed 's/mail\: //'`;
        my @output = split( ' ', `du -sh /export/home/$user | sed 's/\/export//'` );
        print ATTACH "\n Votre repertoire depasse les 100Go merci de verifier :\n";
        print ATTACH "@output \n\n";
        print ATTACH " Destinataire : $mail \n";
        close(ATTACH);
     
        #Envoi de l'alerte
        my $msg = new MIME::Lite->new(
          From    => 'adm@exemple.org',
          To      => 'mdubois@exemple.org',
          Subject => 'Espace disque du repertoire de travail devient important sur CIM PACA',
          Type    => 'multipart/mixed',
        );
     
        $msg->attach(
          Type => 'TEXT',
          Data => "Resultat dans le fichier joint"
        );
     
        $msg->attach(
          Type     => 'TEXT',
          Path     => $fichier,
          Filename => $fichier,
        );
     
        $msg->send;
     
        #On efface le fichier
        unlink $fichier;
      }
    }
    Pouvez vous tester ce code et nous donner les messages d'erreurs ?

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Bonjour Djibril,

    Voilà, le message est toujours là et en plus nous avons une erreur dans le Mine:Lite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./Home_Monitor_V3.pl
    La première expression régulière ne peut être nulle.
    Attempt to bless into a reference at /usr/perl5/site_perl/5.8.4/MIME/Lite.pm line 683.
    J'ai donc modifier mon script comme ceci :
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use MIME::Lite;
    use Sys::Hostname;
    use Socket;
     
    my $hostname = hostname;
    my @users = (`ldapsearch -h localhost -D cn=proxyuser,ou=pam,dc=exemple,dc=org -w xxxx -b ou=People,dc=exemple,dc=org uid=* | grep "uid:" | sed 's/uid: //'`);
     
    foreach my $user (@users) {
    	chomp($user);
    	my @rate=split(' ',`du -sk /export/home/$user`);
    	if ($rate[0] > 100000000  ) {
    		my $fichier= 'attach.txt';
    		open(ATTACH, '>', $fichier ) || die "$fichier : $!";
    		print ATTACH "Attention utilisateur le serveur $hostname vient de verifier ceci : \n";
    		my $mail=`ldapsearch -h localhost -D cn=proxyuser,ou=pam,dc=exemple,dc=org -w xxxx -b ou=People,dc=exemple,dc=org uid=$user | grep mail | sed 's/mail\: //'`;
    		my @output=split(' ',`du -sh /export/home/$user | sed 's/\/export//'`);
    		print ATTACH "\n Votre repertoire depasse les 100Go merci de verifier :\n";
    		print ATTACH "@output \n\n";
    		print ATTACH " Destinataire : $mail \n";
    		close (ATTACH);
     
     
    		#Envoi de l'alerte
    		my $msg = new MIME::Lite
    			From    =>'adm@exemple.org',
    			To      =>'mdubois@exemple.org',
    			Subject =>'Espace disque du repertoire de travail devient important sur CIM PACA',
    			Type    =>'multipart/mixed';
    		attach $msg
    				Type =>'TEXT', 
    				Data =>"Resultat dans le fichier joint";
    		attach $msg
    			Type     => 'TEXT',
    			Path     => $fichier,
    			Filename => $fichier,;
     
    		$msg-> send;
    		#On efface le fichier  
    		unlink $fichier ;
    	}
    }
    Pour enlever l'erreur suivante :
    Attempt to bless into a reference at /usr/perl5/site_perl/5.8.4/MIME/Lite.pm line 683

    Le message :
    La première expression régulière ne peut être nulle.
    est toujours présent


    Notez que je n'arrive pas à avoir le résultat @output dans le mail .... alors que celui de @rate est traité.

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Il serait déjà intéressant de tester ce code en ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    du -sh /export/home/$user | sed 's/\/export//'

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par djibril Voir le message
    Il serait déjà intéressant de tester ce code en ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    du -sh /export/home/$user | sed 's/\/export//'
    Tout juste Djibril,

    Sans le PIPE cela fonctionne très bien,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $output=(`du -sh /export/home/$user`);
    Malheureusement, je ne veux pas que /export apparaisse. Car mes utilisateurs ne le voient pas à travers le montage en NFS, et cette information peut les induire en erreur .....

    Merci

  15. #15
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Pourquoi ne pas le faire en perl ainsi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        my $output = `du -sh /export/home/$user`;
        $output =~ s{/export}{}gi;
     
        print ATTACH "\n Votre repertoire depasse les 100Go merci de verifier :\n";
        print ATTACH "$output \n\n";

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Je pensais à ceci qui est moins coventionel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my @output=split(' ',`du -sh /export/home/$user`);
    print ATTACH "\n Votre repertoire depasse les 100Go merci de verifier :\n";
    print ATTACH "$output[0] /home/$user \n\n";
    Merci ........

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  2. Réponses: 7
    Dernier message: 09/12/2007, 11h51
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h12
  4. [PHP-JS] mettre une variable javascript dans une variable php
    Par Mounr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2007, 09h09
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

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