Forum Programmation.python Je suis trop bête !

Posté par  .
Étiquettes :
0
7
oct.
2009
Bonjour,
je me débats avec un problème surement stupide, mais comme ça fait des heures que je cherche sans trouver, je me retourne vers vous.

Je dois modifier le mot de passe de tous mes utilisateurs (dans un annuaire LDAP).
Tout d'abord, voici un bout de code qui ne fonctionne pas (il fait semblant mais lorsque je vérifie, rien n'a été modifié) :

>import subprocess
>
>f = open("import2.csv","r")
>
>for line in f:
> entries = line.split(";")
> username = entries[3]
> password = entries[5][:-1]
> print "%s %s" % (username, password)
> pipe = subprocess.Popen("smbldap-passwd %s 2>/dev/null 1>&2" % (username), stdin=subprocess.PIPE, shell=True)
> pipe.communicate("%s\n%s\n" % (password,password))
>
>f.close()

la ligne print "%s %s" % (username, password) sert juste à vérifier que je relève bien le username et le password dans un fichier qui contient d'autres informations.

J'ai donc modifié, juste pour voir, le code en
>import subprocess
>
>f = open("import2.csv","r")
>
>for line in f:
> entries = line.split(";")
> username = entries[3]
> password = entries[5][:-1]
> print "%s %s" % (username, password)
> pipe = subprocess.Popen("smbldap-passwd %s 2>/dev/null 1>&2" % ("toto"), stdin=subprocess.PIPE, shell=True)
> pipe.communicate("%s\n%s\n" % ("mdp","mdp"))
>
>f.close()

où toto est un utilisateur qui existe. Ici son mot de passe est changé autant de fois qu'il y a de lignes dans le fichier, mais ... ça marche !

J'ai fait afficher par le programme le type de username et de password et je tombe bien sur str !

L'un d'entre vous aurait-il une idée de la différence entre ces deux situations ?

Merci beaucoup.

PS : c'est sous une debian Lenny et, bien entendu, la commande fonctionne très bien lorsque je la lance directement.
  • # impression d'un mec qui fait pas de python

    Posté par  . Évalué à 2.

    pipe = subprocess.Popen("smbldap-passwd %s 2>/dev/null 1>&2" % ("toto"), stdin=subprocess.PIPE, shell=True)
    pipe.communicate("%s\n%s\n" % ("mdp","mdp"))


    il faut peut-etre que python evalue la variable username et passaword
    mais ne pas oublier de mettre les " autours afin que smbldap-passwd
  • # Tu est surtout timbré

    Posté par  . Évalué à 4.

    Pourquoi n'utilise tu pas une bibliothèque faite pour plutôt que de d'attaquer comme un goret le client shell ?

    http://www.google.com/search?q=python+ldap me donne
    http://www.packtpub.com/article/python-ldap-applications-lda(...)
    voir "Changing an LDAP Password" il y a un bout de code tout prêt pour faire ce que tu souhaite.
  • # shell + ldif + ldapmodify

    Posté par  (site web personnel) . Évalué à 1.

    shell + ldif + ldapmodify
    ou python + ldap

    Système - Réseau - Sécurité Open Source

  • # pas de parenthèses

    Posté par  (site web personnel) . Évalué à 1.

    tu fais
    "qqchose %s" % (username)

    qu'est-ce qu'elles font là tes parenthèses ? pour un singleton on doit mettre une virgule comme (username,)
    et le plus simple c'est encore
    "qqchose %s" % username

    c'est pareil pour ("toto") ...

    c'est quelle version de python ? on s'en fout que c'est debian choutte machin chose ...
    • [^] # Re: pas de parenthèses

      Posté par  . Évalué à 1.

      Salut,
      merci pour la réponse.

      Je sais qu'effectivement c'est inutile.
      Ce que je veux comprendre, c'est pourquoi ça marche avec "toto" et pas avec username et password.

      Pour ce qui est de la version de python, c'est 2.5.2.

      Bye
      • [^] # Re: pas de parenthèses

        Posté par  . Évalué à 2.

        tu as essayé d'ajouter les " autours de username et de password ? afin que smbldap-passwd puisse gerer correctement les variables
  • # HS

    Posté par  . Évalué à 2.

    Pour lire les CSV, utiliser la lib qu'il faut :
    http://docs.python.org/library/csv.html

    Sinon, pour ton problème, il faudrait vérifier que tes login/mdp sont bien comme il faut sans caractères supplémentaires (genre des espaces ...) en faisant un truc du genre :
    print "<%s><%s>" % (username, password)
    • [^] # Re: HS

      Posté par  . Évalué à 2.

      C'est ça ! Merci de m'avoir fait utiliser les chevrons !
      Certains mots de passe, aléatoirement, étaient mal formés (espace à la fin) ! Mon affichage ne permettait pas de le réaliser !

      Dans tous les cas, ça me rassure, je ne voyais pas ce qui pouvait être incorrect dans le script.

      Encore une fois, merci !

      PS : pour ceux qui me conseillaient de n'utiliser que du python, jetez un œil à ce que font les smbldap-tools ! Avant de parvenir au même résultat, il va falloir que j'y passe pas mal de temps (sans parler des tests). Mais c'est vrai que je ne vous ai pas dit que j'avais besoin de modifier des mots de passe samba et linux en même temps...

      PS : merci pour le lien sur le module sur les csv.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.