Necesita poca ayuda con el módulo pexpect.

Necesito ayuda con el módulo pexpect.

He escrito un código simple que clonaría un repository git desde un servidor usando ssh. Estoy enfrentando un par de problemas.

La contraseña se muestra en texto plano.

No sé una forma adecuada de salir del progtwig después de la descarga. arroja el siguiente error …

Traceback (most recent call last): File "ToDelete3.py", line 65, in  # # if i == 1: File "ToDelete3.py", line 36, in getRepository i = p.expect([ssh_key,'password:',pexpect.EOF]) File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1492, in interact self.__interact_copy(escape_character, input_filter, output_filter) File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1520, in __interact_copy data = self.__interact_read(self.child_fd) File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1510, in __interact_read return os.read(fd, 1000) OSError: [Errno 5] Input/output error 

El código que he escrito hasta ahora es:

 command = 'git clone ssh://username@someserver/something.git' ssh_key = 'Are you sure you want to continue connecting' def gracefulExit(): print 'Password Incorrect !!!' os._exit(1) def getRepository(): p = pexpect.spawn(command,maxread=10000,timeout = 100) p.logfile = sys.stdout # logs out the command i = p.expect([ssh_key,'password:',pexpect.EOF]) if i == 0: print 'Inside sshkey' p.sendline('yes') i = p.expect([ssh_key,'password:',pexpect.EOF]) if i == 1: try: p.sendline('mypassword') # this mypassword is shown in clear text on the console p.interact() p.logfile = sys.stdout p.expect(pexpect.EOF) except Exception,e: print str(e) gracefulExit() if i == 2: print 'Inside EOF block' if p.isalive(): print '******************************************************' print ' Closing the process of Download !!! ' print '******************************************************\n\n' p.close() 

Cualquier entrada es muy apreciada ..

Gracias. -Vijay

Hay pocos errores en el progtwig:

 p.interact() 

Esto se usa cuando queremos recuperar el control después de haber suministrado automáticamente la contraseña utilizando el módulo pexpect. No necesita usar eso ya que está automatizando todo el repository de desprotección.

También se pueden mejorar algunas cosas, después de pasar la contraseña, establecer un tiempo de espera infinito, ya que puede tardar un tiempo en copiar un repository git.

 p.expect(pexpect.EOF, timeout=None) 

Después de eso puedes leer toda la salida de ejecución con el siguiente comando

 output_lines = p.before output_lines_list = output_lines.split('\r\n') for line in output_lines: print line 

También puede usar lo anterior para registrar la salida en un archivo escribiendo directamente en él.

El uso de p.logifile = sys.stdout no es bueno, ya que registrará la operación pexpect desde el inicio, incluyendo el paso de la contraseña.

Después de esto no hay necesidad de cerrar, no está ejecutando un progtwig interactivo. Eliminar todas estas líneas:

 if i == 2: print 'Inside EOF block' if p.isalive(): print '******************************************************' print ' Closing the process of Download !!! ' print '******************************************************\n\n' p.close() 

El problema es que algunos tienen que almacenar la contraseña y usarla con p.sendline. Sin embargo, si almacenas la contraseña, será inseguro. También puede tomar la entrada al inicio de la contraseña, de esta manera no almacenará la contraseña dentro de su progtwig, sino que vencerá la automatización. No veo una salida, pero para tomar la entrada de contraseña, puede hacer:

 import getpass getpass.getpass("please provide your password") 

Para deshacerse de la contraseña que se hizo eco de la salida estándar, use lo siguiente al redireccionar la salida:

 p.logfile_read = sys.stdout # logs out the command 

Lo he intentado yo mismo y parece estar funcionando. Aquí está la referencia para esta revelación.