2012-11-20 21 views
5

Próbuję telnetować się do Cisco Routera i wydawać polecenia przy użyciu pexpect. Działa, ale sendline() powtarza się na wyjściu. nawet po użyciu setecho do Fałszywego. Kod jest:pexpect setecho nie działa

''' 
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) 

wyjściowa wynosi:

# 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# 

Odpowiedz

0

Więc, co znalazłem jest ... * setecho po prostu nie wydają się działać (na wyjściu pexpect.before The pexpect obecny jest tekst .sendline). Jedynym rozwiązaniem jest odpięcie sznurka. Coś podobnego kodu sudo of = pexpect.before.strip (pexpect.sendline) * Również podczas logowania, logfile_read nie zawiera echa, ale logfile zawiera (niezależnie od wartości setecho)

0

Kiedyś miałem taki sam problem z echami, nawet gdy echo było wyłączone.

Ale może znalazłem rozwiązanie:

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

Więc w zasadzie, uruchom każesz w powłoce za pomocą „bash -c”, a następnie skręcić z echo w bash.

8

Wiem, że jest to bardzo stare pytanie, ale odpowiadam, ponieważ miałem ten sam problem podczas interakcji z urządzeniami sieciowymi (a nie z terminalami * nix) i nie mogłem znaleźć niczego w sieci, które pomogło. Ponieważ nie ma żadnych szczegółowych odpowiedzi, chciałem zostawić jedno dla innych.

Pexpect ma 3 metody logowania (1. logfile_send(), 2. logfile_read() 3. logfile()).

Na przykładzie wyjście z oryginalnego plakatu powyżej, tutaj jest to, co wygląda jak wyjście dla każdej metody rejestrowania:

1.) p.logfile() będzie logował wyjście echo'd urządzenia sieciowego i będzie rejestrować tekst wysłany przy użyciu send() & sendline(). Tak naprawdę NIE chciał się wydarzyć oryginalny plakat.

W skrypcie:

p.logfile = open('Log.log', 'w+') 

wyjściowa:

# 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() TYLKO zalogować wyjście echo'd urządzenie sieciowe jest. Nie będzie logował znaków p.sendline(). To jest pożądany rezultat, którego szukał oryginalny plakat.

W skrypcie:

p.logfile_read = open('Log.log', 'w+') 

wyjściowa:

# 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 wyśle ​​p.sendline() znaki tylko w dzienniku, który prawdopodobnie nie jest bardzo przydatne w większości przypadków. Pomijam ten przykład, ponieważ każdy prawdopodobnie ma już ten pomysł.

Naprawiono problem z hasłami wyświetlanymi w wynikach dziennika podczas interakcji z urządzeniami sieciowymi.Naprawi to również kwestię pexpect, pokazując podwójne echo w wynikach logu, z czego widziałem kilka osób zadających pytania także w Internecie.

chodzi setecho(False) Per w pexpect docs tym ustawieniu „tryb terminala echa lub wyłącza”. Ta funkcja nie ma na celu wywierania presji na wydajność sendline(), jak ludzie mają nadzieję (w tym ja). A ponieważ miałem do czynienia z urządzeniem sieciowym (cisco, jałowiec, mrv itp.), Próba wyłączenia echa tty okazała się nieprzydatna.

Mam nadzieję, że pomoże to komuś w przyszłości.

+1

Wygląda na to, że rozumiesz. Czy możesz podać przykład? Czy jawnie wywołujesz 'logfile_read()'? A może po prostu ustawisz funkcję na coś, a 'pexpect' wywoła metodę na własną? – Johnston