[SOLUCIONADO] Re: [Python-es] Expect contra smbpasswd
Miguel Ángel Vilela
miguev en gulic.org
Lun Ago 26 18:43:39 CEST 2002
On Mon, Aug 26, 2002 at 01:52:31AM +0200, Chema Cortés wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> El Dom 25 Ago 2002 23:39, Miguel Ángel Vilela escribió:
> > Estoy intentando cambiar la clave Samba de un usuario (desde root) con
> > el módulo de Expect para Python, pero no me funciona. El código que
> > estoy usando es de un ejemplo que trae el paquete python-expect de
> > Debian (uso SID):
> >
> > ----- autopasswd.py -----------------------
> > import sys, time, string
> > from expect import *
> >
> > f = popen2 ("passwd usuario", "p")
> > f.read ("word: ")
> > time.sleep (0.1)
> > f.write ("unaclave\n")
> > f.read ("word: ")
> > time.sleep (0.1)
> > f.write ("unaclave\n")
> > print string.strip (f.read ())
> > ---------------------------------------------
> >
> > Lo único que he cambiado es el comando ejecutado en la tubería, en
> > lugar de passwd he puesto smbpasswd, pero parece que no se deja. El
> > caso es que se traba la primera llamada al read() Probándolo en el
> >
> > intérprete se queda indefinidamente en espera:
> > >>> import expect
> > >>> fd = expect.popen2 ('smbpasswd', 'p')
> > >>> fd.read ()
> >
> > (aquí se queda hasta que corto con Control-C)
> >
> > ¿Qué estoy haciendo mal? Una luz, porfa...
>
> No tengo el expect para hacer la prueba (justo en este momento está
> cerrado sourceforge). Aún así he leido la documentación, y a parte
> de cambiar el comando, también has cambiado la llamada a f.read():
>
> f.read ()
> * If no arguments are passed, then this reads as much data as is
> outputted by the process, blocking until it reads nothing
> (i.e. the process has exited).
>
> f.read (string)
> * If a single string is passed, then read() reads up to and
> including the matching string.
Por ahí debería empezar (RTFM) ¿Dónde está la documentación?
> Tu llamada f.read() está leyendo hasta que acabe el proceso
> (smbpasswd). Como a su vez smbpasswd está esperando a que tú le
> introduzcas un password, ambos procesos esperarán indefinidamente.
> Está documentado como "error de libro" en el uso del popen2. LLama a
> f.read con argumento: eg: f.read("word: ").
He probado con f.read("word: ") y sucede exactamente lo mismo, se
queda indefinidamente a la espera.
>>> import expect
>>> f = expect.popen2 ("smbpasswd usuario", 'p')
>>> f.read ("word: ")
... [unos cuantos cabezazos] ...
Ya lo encontré: por algún motivo para que funcione con smbpasswd no
sirve f.read ("word: ") sino que hay que leer exactamente lo que
smbpasswd imprime. He aquí el código que funciona:
>>> import expect
>>> f = expect.popen2 ("smbpasswd milogin", 'p')
>>> f.read ("New SMB password:")
'New SMB password:'
>>> f.write ("miclave\n")
8
>>> f.read ("Retype new SMB password:")
'\nRetype new SMB password:'
>>> f.write ("miclave\n")
8
>>> f.read ()
'\n'
Gracias por la iluminación sobre f.read() :-)
--
--==-- --==-- Miguel Ángel Vilela --==-- --==--
a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano
GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org
Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es
Public GPG key at http://search.keyserver.net (search for: miguev)
Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs
Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022
-- Linux Driver Petition #73209 --- No ePatents Petition #80354 --
Woodward's Law:
A theory is better than its explanation.
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: application/pgp-signature
Size: 189 bytes
Desc: no disponible
URL: <http://mail.python.org/pipermail/python-es/attachments/20020826/5c6e18f8/attachment.pgp>
Más información sobre la lista de distribución Python-es