Ypmatch(Perl)

Bonjour,
SVP, est ce quelqu'un peut m'aider à comprendre le script suivant,je sais Grosso modo ce qu'il fait mais j'ai besoin de plus d'explication .

$TROUVE = 0 ;
open (F0,"ypmatch $UID passwd.byuid|") ;
while (<F0>) {
split(/:/) ;
$LOGIN = @_[0] ;
$HOME = @_[5] ;
$TROUVE = 1 ;
}

print STDERR "Utilisateur $LOGIN trouve : $HOME \n" ;

if ( $TROUVE == 0 ) {
print STDERR "Utilisateur $LOGIN non trouve dans passwd\n" ;
exit 1 ;
}
close F0;

merci :) je suis débutante en Perl :)
Configuration: Windows XP
Firefox 2.0

14 réponses

  1. Bonjour
    merci beaucoup "dubcek" pour votre aide, ça marche :)
    1. oui tout à fait,c'est plus propre :)
      j'ai un autre soucis :s
      j'ai essayé d'utiliser l'expression régulière suivante :

      if(($filename=~/.old/) || ($filename=~/.mag/) || ($filename=~/.sav/))
      {
      print($filename");
      }

      sachant que .old , .mag et .sav sont les extensions recherchées...
      mais cela n'affiche rien du tout, et mon script marchait bien avant que j'y ajoute ces deux lignes de code :s :s
      1. Contributeur
        tant mieux, mais ne faudrait-il pas plutôt faire:

        if ( $TROUVE == 0 ) {
        print STDERR "Utilisateur $LOGIN non trouve dans passwd\n" ;
        #exit 1 ;
        }
        else
        {
        print STDERR "Utilisateur $LOGIN trouve : $HOME \n" ;
        print("$LOGIN");
        }
        1. ah oui c'est vrai :) évidemment :d:d
          je vous montre le script modifié :

          #!/bin/perl
          #use warnings;
          use CGI::Carp qw(fatalsToBrowser);
          my $filename;
          my $dir='/home/spool/messagerie/forward';
          chomp $dir;
          opendir(DIR,$dir) || die "cannot open $dir $!";
          while((my $filename=readdir(DIR)))
          {
          print("\n[ $filename ]\n");
          #my($dev,$inode,$perm,$liens,$uid,$gid,$ndev,$lg,$acces,$mod,$cr,$blksiz
          #e,$bl)=stat("$dir/$filename");
          my @stats = stat("$dir/$filename");
          if(scalar(@stats) == 0) {
          print "\tAucune info\n";
          }
          else {
          print "\t".join(' - ', @stats)."\n";
          }
          $TROUVE = 0;
          $UID=$stats[4];
          open (F0,"ypmatch $UID passwd.byuid|");
          while (<F0>) {
          split(/:/) ;
          $LOGIN = @_[0] ;
          $HOME = @_[5] ;
          $TROUVE = 1;
          }
          {
          print STDERR "Utilisateur $LOGIN trouve : $HOME \n" ;
          print("$LOGIN");
          }
          if ( $TROUVE == 0 ) {
          print STDERR "Utilisateur $LOGIN non trouve dans passwd\n" ;
          #exit 1 ;
          }
          close F0;

          }
          closedir(DIR);

          et ça marche ;)
          merciiiiii
          1. Contributeur
            donc yp fonctionne
            mais dans le script perl, $UID est la variable UID définie dans le shell ? on ne peut pas mettre une variable externe comme ca
            essaye ton script avec au début
            $UID=11543;

            ou bien il faut utiliser ENV our récupérer une variable du shell
            my $uid = $ENV{UID};
            1. re bonjour
              le résultat de la commande est :
              louet>96% ypmatch 11543 passwd.byuid
              bthouve:P43bf4V5aRqXs:11543:10076:Benedicte THOUVENIN, Ifremer Brest PDG-DOP-DCN-BE-LBCM,PDG-DOP-DCB-DYNECO-PHYSED, 02 29 00 85 48:/home1/yao/bthouve:/bin/csh
              1. Contributeur
                tout cela est cohérent, que répond
                ypmatch -x¦ grep passwd

                que répond
                ypmatch $UID passwd.byuid
                1. voila le fichier:

                  # /etc/nsswitch.nis:
                  #
                  # An example file that could be copied over to /etc/nsswitch.conf; it
                  # uses NIS (YP) in conjunction with files.
                  #
                  # "hosts:" and "services:" in this file are used only if the
                  # /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

                  # the following two lines obviate the "+" entry in /etc/passwd and /etc/group.
                  passwd: files nis
                  group: files nis

                  # consult /etc "files" only if nis is down.
                  hosts: nis [NOTFOUND=return] files
                  ipnodes: files
                  # Uncomment the following line and comment out the above to resolve
                  # both IPv4 and IPv6 addresses from the ipnodes databases. Note that
                  # IPv4 addresses are searched in all of the ipnodes databases before
                  # searching the hosts databases. Before turning this option on, consult
                  # the Network Administration Guide for more details on using IPv6.
                  #ipnodes: nis [NOTFOUND=return] files

                  networks: nis [NOTFOUND=return] files
                  protocols: nis [NOTFOUND=return] files
                  rpc: nis [NOTFOUND=return] files
                  ethers: nis [NOTFOUND=return] files
                  netmasks: nis [NOTFOUND=return] files
                  bootparams: nis [NOTFOUND=return] files
                  publickey: nis [NOTFOUND=return] files

                  netgroup: nis

                  automount: files nis
                  aliases: files nis

                  # for efficient getservbyname() avoid nis
                  services: files nis
                  sendmailvars: files
                  printers: user files nis

                  auth_attr: files nis
                  prof_attr: files nis
                  project: files nis

                  la commande ypcat passwd ¦ grep $UID fonctionne bien .
                  elle me renvoie par exemple : dmallet:C0zjFWQRg2o62:40569:10410:Delphine MALLET, Ifremer Noumea PDG-DOP-DCOP-LEADNC-LAC, +687 28 51 71:/home/noumea/perso/dmallet:/bin/csh
                  1. Contributeur
                    un message d'erreur ? que contient /etc/nsswitch.conf ? cat /etc/nsswitch.conf
                    l'utilisateur est défini dans la table passwd NIS ou dans le fichier local /etc/passwd ?
                    ypcat passwd ¦ grep $UID fonctionne ?
                    1. Bonjour 'dubcek',
                      si j'essaye de tester ce script,en passant à la commande ypmatch un UID que je connais,je n'obtiens aucun résultat :

                      Utilisateur trouve :

                      je ne sais pas ce qui manque ...
                      1. Contributeur
                        hello
                        open (F0,"ypmatch $UID passwd.byuid|") ;
                        on exécute la commande ypmatch qui va lire dans la table passwd dans NIS (Network Information Services) l'entrée correspondant à l'utilisateur dont le user id est $UID, une entrée passwd a ce format: bin:x:2:2:bin:/bin:/bin/sh
                        split(/:/) ;
                        on récupère chaque élément de la ligne, séparés par : dans un tableau
                        $LOGIN = @_[0] ;
                        $HOME = @_[5] ;

                        j'ai donc le nom de l'utilisateur $LOGIN dans tableau[0]
                        et son répertoire $HOME dans tableau[5]
                        puis on affiche et on teste