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. 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
    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
        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. 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
            tout cela est cohérent, que répond
            ypmatch -x¦ grep passwd

            que répond
            ypmatch $UID passwd.byuid
            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
                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. 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
                    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. 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