Mikrotik python mac-telnet, не может отправлять команды

Я программирую скрипт для настройки микротика через файл Python. Я могу подключиться к микротику через SSH, Telnet и mac-telnet, но я не могу отправить команду на микротик, вывод - процесс прерывается. Не могли бы вы помочь мне с нажатием команд в скрипте Python с помощью mac-telnet? Я тестировал функцию mactelnet в main.

Я также включаю сценарий.

Большое спасибо.

    import sys, posix, time, md5, binascii, socket, select
import pexpect
import os

class LoginManager:
    """ Class representing Microtic """
    def __init__(self,hostIP,login,password):
        self.host = hostIP
        self.username = login
        self.pwd = password

    #telnet na mikrotik
    def loginTelnet(self,login,password):
        """
        Function to login to mikrotik via telnet
        :param login:
        :param password:
        :return:
        """
        import telnetlib
        try:
            host = '172.16.49.2'
            port = 23
            telnetcon = telnetlib.Telnet(host,port)
            telnetcon = telnetlib.Telnet(host)
            #user input
            telnetcon.read_until(b"Login: ")
            telnetcon.write(login.encode()+"\n")
            #user password
            telnetcon.read_until(b"Password: ")
            telnetcon.write(password.encode()+b"\n")
            time.sleep(10)
            telnetcon.close()
            '''
            telnetcon.read_until()
            telnetcon.read_all('Please press "Enter" to continue!'+"\n")
            telnetcon.write('\013')
            telnetcon.read_all('/ip address print')
            '''
        except:
            print "Cannot connect to router via telnet"

    #metoda na prihlasenie pomocou SSH
    def loginSSH(self,login,password):
        from pexpect import pxssh,spawn,expect
        import getpass
        try:
            #self.login = login
            #self.password = password
            connect = pxssh.pxssh()
            server = '172.16.49.2'
            login = 'admin'
            password = 'admin'
            port = 22
            connect.login(server,login,password)
            commands = pxssh.spawn()
            time.sleep(10)
            connect.logout()
            '''
            commands.expect('Please press "Enter" to continue!')
            commands.sendline('\013')
            connect.sendline('/ip address print')
            connect.prompt()
            print connect.before
            '''
        except pxssh.ExceptionPxssh,e:
            print "Error"
            print str(e)


#router = RouterOS('172.16.49.2', 'admin', 'admin')
#router.loginTelnet('admin','admin')


#os.system("mactelnet -l -t 50 > mt.output 2>&1")
#zoznam devicov
deviceList = []
loadMacAddress = False
with open("mt.output", "r") as file:
    for line in file:
        if loadMacAddress:
            macAddress = line.split()[1]
            deviceList.append(macAddress)
        else:
            header = line.split()
            if len(header)>1:
                if "IP" in header[0] and "MAC-Address" in header[1]:
                    loadMacAddress = True

print deviceList
username = 'admin'
password = '""'
os.system('mactelnet {} -u {} -p {}'.format(deviceList[0], username, password))
os.system("interface print")
#print udajue[0][0]

Адриан


person Adrian Bardossy    schedule 28.10.2017    source источник
comment
Вызов os.system() запускает одну команду и возвращает результат, когда эта команда завершается — между одним вызовом и другим нет непрерывности.   -  person Charles Duffy    schedule 28.10.2017
comment
Следовательно, вы не можете использовать os.system() для этого. subprocess.Popen() — лучший инструмент для работы.   -  person Charles Duffy    schedule 28.10.2017
comment
Я думаю об использовании API после входа через mac-telnet в микротик, т.е. отправки /interface/print, но я не могу сделать это через библиотеку is.system(), не могли бы вы дать мне какое-нибудь предложение?   -  person Adrian Bardossy    schedule 28.10.2017
comment
Я уже сделал. Используйте библиотеку subprocess, чтобы запустить один процесс, которому принадлежит соединение, а затем отправить дальнейшие команды этому процессу.   -  person Charles Duffy    schedule 28.10.2017
comment
Поскольку также доступен интерфейс SSH, вы также можете рассмотреть paramiko-expect.   -  person Charles Duffy    schedule 28.10.2017
comment
Мой руководитель хочет, чтобы я в первую очередь использовал mac-telnet, поэтому мне нужен mac-telnet для отправки команд.   -  person Adrian Bardossy    schedule 28.10.2017
comment
Если вы можете использовать только mac-telnet, почему telnetlib и pexpect вообще включены в ваш вопрос? См. рекомендации по созданию минимально воспроизводимого примера — мы ожидаем кратчайший возможный код который иллюстрирует заданную проблему. (Более того, мы хотим, чтобы этот код мог быть проверен другими людьми, кроме вас, чтобы кто-то мог проверить свой ответ, если это вообще возможно — это означает, что вы можете подумать о другом тестовом примере, который вы можете написать, который не требует конкретного маршрутизатора вы пытаетесь автоматизировать, но используете клиент telnet, скажем, для выполнения простого HTTP-запроса).   -  person Charles Duffy    schedule 28.10.2017
comment
решена, проблема заключалась в том, что маршрутизатор (аппаратное обеспечение) отлично работал с виртуальной машиной   -  person Adrian Bardossy    schedule 12.11.2017


Ответы (1)


Попробуйте использовать этот модуль api mikrotik python: https://github.com/rtician/routeros. Пример ниже был взят из README.md в репозитории:

$ pip install routeros 

Я тестировал это с Python 3.6.4, и это сработало. Обратите внимание, что ваш доступ к API должен быть включен в IP-> Services на вашей RouterOS.

from routeros import login

routeros = login('user', 'password', '10.1.0.1')
sample = routeros.query('/ip/pool/print').equal(name='dhcp')
routeros.close()

print(sample)

Пример вывода:

({'.id': '*1', 'name': 'dhcp', 'ranges': '192.168.88.10-192.168.88.254'},
 {'.id': '*2', 'name': 'hs-pool-8', 'ranges': '10.5.50.2-10.5.50.254'})

Или используйте анзибл. Есть несколько библиотек, которые используют ansible для связи с маршрутизаторами Mikrotik по ssh.

person widerin    schedule 25.01.2018