2012-11-20 8 views
5

Sto provando a telnet a Cisco Router e dare comandi usando pexpect. Funziona, ma sendline() si ripete nell'output. anche dopo aver usato setecho su False. Codice è:pectect setecho non funziona

''' 
Created on Nov 19, 2012 

@author: Amit Barik 
''' 

import pexpect 

hostname = 'hostname' 
login_cmd = 'telnet ' + hostname + '.net' 
username = 'username' 
password = 'pwd' 
prompt = hostname + '#' 

p = pexpect.spawn(login_cmd) 
p.setecho(False) 
p.logfile = open('Log.log', 'w+') 

p.expect('Username:') 
print '1',repr(p.before) 

p.sendline(username) 
p.expect('Password:') 
print '2',repr(p.before) 

p.sendline(password) 
p.expect(prompt) 
print '3',repr(p.before) 

cmd = 'show clock' 
p.sendline(cmd) 
p.expect(prompt) 
print 'Output for {0}'.format(cmd), repr(p.before) 

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 
username 
Password: pwd 

My Cisco Banner 

hostname#show clock 
show clock 
00:16:40.692 UTC Tue Nov 20 2012 
hostname# 

risposta

0

Quindi, quello che ho trovato è ... * setecho proprio non sembra funzionare (in uscita pexpect.before, il pexpect .sendline text is present). L'unica soluzione è fare lo stripping delle stringhe. Qualcosa come il codice sudo di = pexpect.before.strip (pexpect.sendline) * Inoltre, durante la registrazione, logfile_read non contiene gli echi, ma il file di log contiene (indipendentemente dal valore setecho)

0

Avevo lo stesso problema con echos, anche quando l'eco è stato disattivato.

Ma forse avrei trovato una soluzione:

commandToRun = 'bash -c "less /readfile | tail -4"' 
yourConnection.sendLine("stty -echo") 
commandResult = yourConnection.sendLine(commandToRun) 
self.sendLine("stty echo") 

Quindi, in pratica, esegue vi comando in una shell usando 'bash -c' e poi girare di echo in bash.

8

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.

+1

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