LINUX.ORG.RU
ФорумAdmin

Как передать нажатие клавиш по telnet с помощью python modul pexpect?

 ,


0

1

Недавно познакомился с питоном, попробовал написать пару скриптов по работе, использовал modul pexpect для подключения по telnet к сетевому оборудованию и с толкнулся с такой проблемой. Когда отправляешь информационную команду например «display vlan 3» получаемый вывод делиться на несколько страниц, его можно промотать с помощью клавиш клавиатуры ‘sapce’,‘enter’ либо например другая клавиша например ‘Q’ которая делает прерывании вывода команды. Не совсем понимаю как это реализовать,но пробовал такие модули как ‘keyboard’,‘pyautogui’ и другие способы, ни один не помог. Может у кого-нибудь есть мысли или кто уже сталкивался с такой проблемой и может поделиться?

Заранее премного благодарен!


https://docs.python.org/2/library/telnetlib.html

[code] mport getpass import sys import telnetlib

HOST = «localhost» user = raw_input("Enter your remote account: ") password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ") tn.write(user + «\n») if password: tn.read_until("Password: ") tn.write(password + «\n»)

tn.write(«ls\n») tn.write(«exit\n»)

print tn.read_all() [/code]

int13h ★★★★★
()
Последнее исправление: int13h (всего исправлений: 1)

Может тебе стоит взглянуть на специализированные либы типа netmiko для автоматизации рутины сетевиков?

BOOBLIK ★★★
()

не совсем понятно что вы хотите

вы хотите скриптом и с консолью работать и тут же перенаправлять на telnet сервер то что в консоли будете нажимать?

И ответы телнет сервера на консоль вываливать?

Vlad-76 ★★★★
()
Последнее исправление: Vlad-76 (всего исправлений: 3)
Ответ на: комментарий от Vlad-76

Я дико извиняюсь если не очень ясно изъясняюсь. Смысл такой, например скрипт заходит на оборудование вводит команду, это команда выводит какую-то информацию. К примеру вывод команды:

[code] Command: display vlan 10

adl act/up 0/ 0/ 0 5 24 - -
adl act/up 0/ 0/ 3 1 44 - -
adl act/up 0/ 0/ 5 1 14 - -
adl act/up 0/ 0/12 1 24 - -
adl act/up 0/ 0/15 1 14 - -
adl act/up 0/ 0/17 1 24 - -
adl act/up 0/ 2/ 0 1 34 - -
—- More ( Press ‘Q’ to break ) —- [/code]

В конце вывода требует нажатие клавиши ‘Q’ что бы прервать вывод, либо можно нажать ‘space’ что бы пролистать страницу вывода, либо ‘enter’ что бы пролистать построчно. Так вот, мой вопрос заключался в том что бы сделать эмуляцию этих нажатий, что бы можно где-то пролистать, где-то прервать вывод.

Eqvoc
() автор топика

А чего код не покажешь?

Коды клавиш зависят от терминала, вот, рабочий пример для xterm:

import os
import pexpect
import time

KEYS = {
    'DOWN': '\033[B',
    'RIGHT': '\033[C',
    'ENTER': '\r'
}

...

os.environ['TERM'] = 'xterm'
os.environ['LINES'] = '25'
os.environ['COLUMNS'] = '80'

term = pexpect.spawn('telnet {hostname}'.format(hostname=hostname))
term.expect('login: ')
term.sendline(login)
term.expect('password:')
term.sendline(password)
term.expect(matching_string)

term.send(KEYS['DOWN])
time.sleep(1)
term.send(KEYS['RIGHT])
time.sleep(1)
term.send(KEYS['RIGHT])
time.sleep(1)
term.send(KEYS['DOWN])
time.sleep(1)
term.send(KEYS['ENTER])
time.sleep(1)

...

Код коннектится к серверу hostname, ожидает увидеть на экране совпадение с matching_string и эмулирует проход по менюшкам - вниз, вправо, вправо, вниз и ентер.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от Eqvoc

посмотрите в описание команд железяки, возможно есть команда которая отключает постраничный вывод

ловить промпт все равно придется

в добавление к прошлому посту

можно увеличить число принимаемых строк

os.environ[‘LINES’] = ‘5000’ т.е. вы говорите телнет серверу что у вас на экране (как будто) будет отображаться 5000 линий за раз, железка это поймет и выведет информацию без «—- More ( Press ‘Q’ to break ) —- [/code]»

и далее ловите матчингом промпт вашей железки

Vlad-76 ★★★★
()
Последнее исправление: Vlad-76 (всего исправлений: 1)
Ответ на: комментарий от vvn_black
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os,time
import pexpect

fiop = open('ipaddress.txt','r')

for ip in fiop.readlines():
        telconn = pexpect.spawn('telnet '+ip)
        print('connecting '+ip+'\r\n')
        time.sleep(3)
        telconn.logfile = sys.stdout.buffer
        telconn.expect(":",timeout=3)
        time.sleep(2)
        telconn.send("admin" + "\r")
        telconn.expect(":")
        telconn.send("admin" + "\r")
        telconn.send("\r\n")
        time.sleep(2)
        telconn.expect(matching_string)
        telconn.send("enable" +"\r")
        telconn.expect("#")
        telconn.send("display vlan 10"+"\r")
        telconn.send("\r\n")
        time.sleep(1)
        telconn.expect("---- More ( Press 'Q' to break ) ----")
        # а тут я не знаю что такое написать что бы имитировало нажатие 'Q'
...

Как говорится вот такой я скрипт написал как понял, то что бы написано на просторах интернета. Как понял так и написал.

Eqvoc
() автор топика
Ответ на: комментарий от Vlad-76

можно увеличить число принимаемых строк

Так точно, в моём случае, там интерактивный интерфейс был.

vvn_black ★★★★★
()
Ответ на: комментарий от Eqvoc

увеличьте число принимаемых строк, может это облегчит решение вашей задачи.

telconn.expect(«—- More ( Press ‘Q’ to break ) —-») - одной такой строкой вы не справитесь, нужно через или делать условие

telconn.expect([‘—- More ( Press ‘Q’ to break ) —-’, ‘#’])

потому как скрипт не знает - закончился ли вывод команды или прислали очередную порцию вывода.

и далее пускать алгоритм в ветку в зависимости от того какую строку словили ‘—- More ( Press ‘Q’ to break ) —-’ или ‘#’


https://pyneng.readthedocs.io/ru/latest/book/19_ssh_telnet/pexpect.html … Обратите внимание, что теперь возвращается 1. Это значит, что совпадением было слово Password.


попробуйте сделать буфер по приему оч большой

os.environ[‘LINES’] = ‘5000’

и далее ловить только промпт - #

telconn.expect([‘#’])

но это при условии что os.environ[‘LINES’] = ‘5000’ норм отрабатывает - скрипт отправляет то что нужно и железка понимает. Иначе городить условия.

Vlad-76 ★★★★
()
Ответ на: комментарий от Eqvoc

«# а тут я не знаю что такое написать что бы имитировало нажатие ‘Q’»

запустите tcpdump и сохраните telnet сессию с железкой в файл. Далее запустите с консоли telnet и проделайте все команды. закройте telnet сессию. после запустите wireshark откройте сохраненный tcpdump ом файл обмена и посмотрите что нужно слать на оборудование когда оно Вам высвечивало «—- More ( Press ‘Q’ to break ) —-»

Vlad-76 ★★★★
()
Ответ на: комментарий от Vlad-76

«но это при условии что os.environ[‘LINES’] = ‘5000’ норм отрабатывает - скрипт отправляет то что нужно и железка понимает. Иначе городить условия.»

это тоже можно будет увидеть в tcpdump сессии, отправляет ли скрипт число 5000 или нет

Vlad-76 ★★★★
()
Ответ на: комментарий от Vlad-76

потому как скрипт не знает - закончился ли вывод команды или прислали очередную порцию вывода.

Как вы и говорили, сделал следующим образом, в результате все получилось, при команде telconn.send(«q») вывод команды прерывается.

telconn.send("display vlan 1000"+"\r")
time.sleep(1)
telconn.send("q")
telconn.expect("#")

Но все же встретился со следующей проблемой:

telconn.logfile = sys.stdout.buffer
Я так понимаю эта строчка позволяет делать прямой вывод в консоль. Так вот, дело в том что ко всему скрипту я добавляю еще например несколько строчек например:

telconn.sendline("quit\r") <= первая строчка это выход из конфиг режима.
telconn.expect("#")
telconn.sendline("quit\r") <= вторая выход с оборудования.
telconn.expect("#")

Получается что во первых не выводится в консоль эти команды, а во вторых они не исполняются, как бы проглатываются и не прописываются. Пробовал другие команды подставлять, такая же ерунда. Не совсем понятно почему так происходит, случайно это не влияет размер буфера? или кол-во строк которые принимает терминал по умолчанию? или еще что-нибудь?

Eqvoc
() автор топика
Ответ на: комментарий от Eqvoc

а как Вы определяете «а во вторых они не исполняются, как бы проглатываются и не прописываются.» в логе tcpdump нет обмена?

может быть все и происходит, только Вы не можете определить место в котором оказался Ваш скрипт

Vlad-76 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.