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