[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