Ypmatch(Perl)

Fermé
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009 - 25 juin 2009 à 12:13
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009 - 29 juin 2009 à 09:01
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 :)
A voir également:

14 réponses

dubcek Messages postés 18723 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 11 mai 2024 5 615
25 juin 2009 à 12:56
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
0
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
25 juin 2009 à 13:38
merciii pour votre réponse :)
0
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
26 juin 2009 à 09:59
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 ...
0
dubcek Messages postés 18723 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 11 mai 2024 5 615
26 juin 2009 à 10:35
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
26 juin 2009 à 11:09
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
0
dubcek Messages postés 18723 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 11 mai 2024 5 615
26 juin 2009 à 12:01
tout cela est cohérent, que répond
ypmatch -x¦ grep passwd

que répond
ypmatch $UID passwd.byuid
0
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
26 juin 2009 à 13:30
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
0
dubcek Messages postés 18723 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 11 mai 2024 5 615
26 juin 2009 à 13:54
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};
0
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
26 juin 2009 à 14:02
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
0
dubcek Messages postés 18723 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 11 mai 2024 5 615
26 juin 2009 à 15:18
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");
}
0
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
26 juin 2009 à 15:46
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
0
dubcek Messages postés 18723 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 11 mai 2024 5 615
26 juin 2009 à 16:16
il y a un " de trop ou manquant ?
print($filename");
0
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
26 juin 2009 à 21:03
ah ouiii !!!!!!
manquant ;)
merci,je testerai ça Lundi :)
0
youllla Messages postés 24 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 6 juillet 2009
29 juin 2009 à 09:01
Bonjour
merci beaucoup "dubcek" pour votre aide, ça marche :)
0