2012-05-11 9 views
5

Nuevo en Stackoverflow, así que primero, hola.ssh usando python sin claves RSA

Estoy trabajando en un pequeño proyecto para mi escuela que se supone que es un gui personalizado (escrito en Python como un desafío educativo para mí ya que nunca he usado Python) para el programa de código abierto Unison. Estamos tratando de permitir que los estudiantes y el personal sincronicen una carpeta en el hogar y la escuela iniciando este programa con la menor cantidad de información posible (prueba de idioteces si lo desea). Se supone que la interfaz es solo el nombre de usuario y la contraseña de la escuela, y la interfaz gráfica de usuario solo debe enviar el nombre de usuario y la contraseña a Unison y sincronizarlos.

El problema es que Unison a su vez inicia SSh y solicita la contraseña pero el método python subprocess.communicate (input) no permitirá que ssh tome la contraseña. Me di cuenta de que ssh solo aceptará la entrada del terminal y no puedo entender cómo engañarlo. He leído algunas cosas sobre el uso de un pseudo terminal, pero todavía estoy perplejo. Las claves RSA serían la solución ideal, pero generarlas y luego colocarlas en el servidor remoto implica que necesito iniciar sesión con una contraseña al menos una vez y eso requeriría una solución a lo anterior, o la terminal que no es a prueba de idiotas.

def startSync(self): 
    ''' 
    ''' 
    userName = self.userNameIn.get() 
    userPass = self.userPassIn.get() 
    localDir = "/Users/localuser/syncFolder/" 
    remoteDir = " ssh://schoolServer/remotesyncFolder" #for testing purposes, I set this to my own home machine which logs into my own account if I don't provide [email protected] 
    unisonExecRemotePath = " -servercmd /Users/RemoteMe/unison" #unison is the unix executable responsible for launching unison on the remote system 
    silenceCmdPrompts = " -silent" #keeps unison from displaying directory differences and asking if its okay to sync 
    executionString = "./unison" + localDir + remoteDir + unisonExecRemotePath + silenceCmdPrompts 

    mainProcess = subprocess.Popen(executionString,shell = True, stdin = subprocess.PIPE) 
    mainProcess.communicate(userPass) 

Las cadenas de ejecución funciona bien allí terminal si me pego. Y algún consejo pitón general, también se agradecería que usted está tan inclinado.

Gracias!

Unison Manual del usuario: http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html

Editar: También debo señalar que mientras yo estoy actualmente en desarrollo en OSX y Linux, que finalmente tendrá que hacer compatible esta ventana ya que la mayoría de los estudiantes de mi escuela ejecutar Windows como su máquina primaria (o única).

Respuesta

3

Busque en pexpect.

import pexpect 

child = pexpect.spawn('ssh [email protected]') 
child.expect('Password:') 
child.sendline(mypassword) 
child.interact() 
+0

Acabo de intentar probar este lado mi proyecto con exactamente lo que tiene allí (obviamente con un host real) y no pasa nada. Pausa leve y luego volver a un indicador de bash sin mensajes. Traté de agregar toda la línea de ejecución desde mi código anterior pensando que tal vez simplemente se cierra si no se le da nada, pero hace lo mismo. – Hiroshi

+0

Asegúrese de que el argumento que pasa a child.expect() coincide con la solicitud de contraseña que el servidor le brinda. Además, es posible que necesite llamar a child.interact() después de child.sendline (mypassword). Ha pasado un tiempo desde que utilicé Pexpect, pero es la herramienta para el trabajo. –

+0

¡Funcionó! ¡Gracias! :) – Hiroshi

2

Si desea enviar una contraseña para ssh es necesario abrir pseudoterminal (un pty) y hablar con él usando que en lugar de usar sólo stdin/stdout. Eche un vistazo al módulo pexpect, que está diseñado para hacer exactamente eso.

Una solución alternativa implicaría algún tipo de mecanismo fuera de banda para distribuir claves públicas: por ejemplo, configure una aplicación web simple donde las personas puedan pegar una clave pública y hacer que administre el archivo authorized_keys en nombre de el usuario.

Cuestiones relacionadas