Pregunta

Estoy escribiendo una biblioteca para admitir telnet'ing a un servidor remoto y ejecutar aplicaciones.

Las cosas van a establecer una conexión, recuperando los datos, el análisis, etc. (al menos tan bien como puede ser para comunicarse con los programas a través de una interfaz de texto).

Una aplicación cambiará el cursor si entra correctamente, o dejará el cursor original si falla (no escribo las aplicaciones, solo tengo que usarlas).

Cuando dicha aplicación comienza correctamente, esto funciona sin problemas:

promptB = "hello(x)# "   # Yes, the space at the end is intentional
response = tn_conn.cmd("app_name\n", prompt=promptB)

Me gustaría usar el cambio de inmediato (o la falta de cambio de inmediato) para detectar si el programa no se inició. Pensé que esta sería una oportunidad de oro para probar la esperanza de TelnetLib (), ya que la esperanza () permite que uno pase una lista de cuerdas que coincidan en la respuesta.

Sin embargo, no puedo hacer que esto funcione:

promptA = "hello(x)# "   # Yes, the space at the end is intentional
promptB = "hello> "      # Yes, the space at the end is intentional

tn_conn.write("app_name\n")
which_prompt, mo, response = self.tn_conn.expect([promptA, promptB], timeout=3)

El comando esperar siempre fuera, ya sea para las aplicaciones, comienza con éxito o no.

que = "-1"

Mo = ninguno

Respuesta = "Mumble Mumble r r n otras cosas r n r nhello#"

Los documentos dicen que se puede pasar una cadena o un objeto regex para esperar (estoy pasando una cadena), ¿me falta algo? Una mirada al código TelnetLib muestra que su llamado re.search (), no re.match (), por lo que ese no parece ser el problema.

¿Alguien puede ofrecer sugerencias sobre lo que estoy haciendo mal?

EditarSe agregó el parens al ejemplo de ejemplo para ilustrar mejor por qué esperar () no funcionaba como se esperaba.

¿Fue útil?

Solución 3

En intentos anteriores, había seguido la opción de regex colocando .* en ambos extremos de mi cadena de búsqueda, además de hacer un re.compile() a la cadena de búsqueda antes de pasarla/ .expect(); Todo sin suerte.

Gracias a la sugerencia del jatanismo, volví a examinar usando Regex, esta vez con el pensamiento de que expect() era, er ... esperando 'regex' donde estaba pensando 'cadena'.

Efectivamente, había caracteres en mi cadena rápida que se trata de tratar como símbolos regex - ()es ser exacto. Escapar de los padres deja expect() hacer su trabajo.

Otros consejos

No olvide que si está utilizando el Regex en Python, siempre puede usar el RAW (r'my string') Método en lugar de agregar todos los escapes; lo hace más legible.

Tengo algo para trabajar. Lookig para # o % o $ indicaciones. En cuanto a sus indicaciones, asegúrese de que se escapen los caracteres especiales. (). Tal vez escapar de todo solo para estar seguro.

idx, obj, response = tn_conn.expect("\#","\%","\$",3)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top