So che questa è una domanda super vecchia, ma sto rispondendo dal momento che ho avuto lo stesso problema quando interagivo con i dispositivi di rete (non terminali * nix) e non ho trovato nulla sul web che abbia aiutato. Dal momento che non ci sono risposte dettagliate, volevo lasciarne una per gli altri.
Pexpect ha 3 metodi di registrazione (1. logfile_send()
, 2. logfile_read()
3. logfile()
).
Utilizzando l'esempio di uscita dal manifesto originale di cui sopra, qui è ciò che l'output appare come per ogni metodo di registrazione:
1.) p.logfile()
registrerà uscita echo'd del dispositivo di rete e si registra il testo inviato utilizzando send()
& sendline()
. Questo è ciò che il poster originale NON voleva accadere.
In script:
p.logfile = open('Log.log', 'w+')
uscita:
# On Python Console
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n'
# On Log File
Username: username #This is the `sendline()` output
username #This is echo from the network device
Password: pwd #This is `sendline()` output
#Notice, pwd only echo's once. There is no echo from the network device since it doesn't echo passwords
My Cisco Banner
hostname#show clock #This is the `sendline()` output
show clock #This is echo from the network device
00:16:40.692 UTC Tue Nov 20 2012
hostname#
2.) p.logfile_read()
sarà solo il login uscita echo'd del dispositivo di rete. Non registra i caratteri p.sendline()
. Questo è il risultato desiderato che il poster originale stava cercando.
In script:
p.logfile_read = open('Log.log', 'w+')
uscita:
# On Python Console
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n'
# On Log File
Username: username #This is echo from the network device
Password: #There is no echo from the network device since it doesn't echo passwords
My Cisco Banner
hostname#show clock #This is echo from the network device
00:16:40.692 UTC Tue Nov 20 2012
hostname#
3.) p.logfile_send
invierà solo i p.sendline()
caratteri al registro, che probabilmente non è molto utile nella maggior parte dei casi. Salterò l'esempio, dato che probabilmente tutti hanno l'idea ormai.
Quindi, utilizzando logfile_read()
si risolverà il problema con le password mostrate nell'output del registro quando si interagisce con i dispositivi di rete.Questo risolverà anche il problema di pexpect che mostra il doppio eco nell'output del registro, che ho visto alcune persone fare domande anche online.
Riguardo a setecho(False)
, per il pectect docs, imposta o disattiva la "modalità di eco del terminale". Quella funzione non ha lo scopo di sorvolare l'output di sendline()
come speravano le persone (incluso me stesso). E dal momento che avevo a che fare con un dispositivo di rete (Cisco, Juniper, MRV, ecc.), Provare a disattivare tty echo non era utile.
Spero che questo aiuti qualcuno in futuro.
Sembra che tu capisca. Puoi fornire un esempio? Chiami esplicitamente 'logfile_read()'? O semplicemente si imposta la funzione su qualcosa e 'pexpect' chiamerà il metodo su di esso? – Johnston