Telnetlib Python não está executando comandos remotos em Mikrotik .

Bem vindos!!

Mais uma do PreciseiPostei para você!!


PROBLEMA:

PRECISEI utilizar um módulo do python chamado Telnetlib em um outro módulo que criamos para realizar consultas e alterar configurações de um roteador Mikrotik RB750.

Como base, começamos utilizando um exemplo aplicado do módulo Telnetlib que encontramos na pagina oficial (http://docs.python.org/3.6/library/telnetlib.html ) onde também encontramos todos os métodos que esse módulo possui.

O módulo criado conseguia se autenticar no mikrotik utilizando o telnetlib, porém ao executar os comandos não obtinha a saída dos resultados. Após a autenticação o módulo ficava em aguardo e permanecia nesse status.

PARA SOLUCIONAR:

Abaixo está o módulo que criamos que utiliza o módulo telnetlib. Vamos utiliza-lo para explicarmos a solução.

Para download do módulo acima acessar: https://pypi.python.org/pypi/PytelnetMK

Duas ações foram muito importantes para a solução.

  1. Utilizar o método set_debuglevel(1000).

Conforme link oficial do módulo telnetlib (que contém a descrição desse método) quanto maior o valor passado para ele, maior será o nível de debug mostrado na saída do console (em nosso caso passamos o valor 1000).

O texto oficial diz:

Set the debug level. The higher the value of debuglevel, the more debug output you get (on sys.stdout) https://docs.python.org/3.6/library/telnetlib.html

Utilizando esse método conseguimos verificar qual era o problema.
Percebemos que: após concluída a autenticação no servidor Telnet do Mikrotik, utilizando o módulo Telnetlib, todos os comandos que eram enviados não eram executados. Somente com o uso do método, set_debuglevel, conseguimos verificar que os comandos estavam sendo enviados, porém só eram “printados” e não executados.

Então nos perguntamos: Como os comandos enviados para autenticação(usuário e senha) funcionavam e os comandos para interagir com o Mikrotik não?

Todos os exemplos que encontramos utilizavam a constante de escape \n acionando carriage return(enter) para a execução do comando. No Mikrotik também funcionava , pois estávamos conseguindo conectar a ele com êxito.

Aí veio a dúvida:

para a autenticação funciona e consigo me conectar ao Mikrotik,mas PARA INTERAGIR COM O MIKROTIK NÃO? Será que ele utiliza a mesma constante de escape?

Então deduzimos que para interagir com o Mikrotik, ele deveria utilizar outra constante de escape para acionar o carriage return(tecla enter). Foi então que recorremos ao site oficial da Mikrotik e olha o que tinha lá!!

ref: http://mikrotik.net.pl/wiki/Scripty

Após essa conclusão fomos para a segunda ação:

2. Mudamos no módulo os métodos que enviava comando para interagir com o Mikrotik e colocamos o \r ao invés do \n para executar um carriage return(enter) ao final do comando.

Obs: o atributo cmd será o comando a ser executado

Feito isso, conseguimos executar um print dos endereços IPs do mikrotik

Colocamos um \r ao invés do \n e FUNFOU!!! –

Assim sendo, PRECISEI dessa solução e após encontrá-la, POSTEI!!


logo_preciseipostei

É isso ai , mais uma do PreciseiPostei . Espero ter ajudado!!


Configuração do sistema utilizado:

Sistema: Linux

Distribuição:Fedora Workstation 26

Python Versão 3

RouterOS: 6.18

pyTelnetMK Versão 0.0.2
REFERÊNCIAS:

http://docs.python.org/3.6/library/telnetlib.html

http://www.python.org

http://mikrotik.net.pl/wiki/Scripty

https://pypi.python.org/pypi/PytelnetMK

Ajude a outros..Compartilhe!!

2 thoughts on “Telnetlib Python não está executando comandos remotos em Mikrotik .

  1. hi
    your implementation creates connection for executing each command. It is very slow.

    I have rewrited it. Maybe you push it in original module.
    —-
    import telnetlib

    class PytelnetMK():
    def __init__(self, host, user, password):
    self.tn = telnetlib.Telnet(host)
    self.tn.read_until(b”Login:”)
    self.tn.write(user.encode(‘ascii’) + b”\n”)
    if password:
    self.tn.read_until(b”Password:”)
    self.tn.write(password.encode(‘ascii’) + b”\n”)
    print(“Connected!!!”)

    def cmd(self, cmd):
    self.tn.read_until(b”ik] >”)
    self.tn.write(cmd.encode(‘ascii’) + b”\r”)
    print(self.tn.read_until(b”ik] > “).decode(‘UTF8’))

    def close(self):
    self.tn.close()

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *