Парамико разделить линии на HTML-странице - PullRequest
0 голосов
/ 29 апреля 2019

В моем скрипте Paramiko / Python мне нужно вывести результаты подключения на веб-страницу в HTML. Когда я делаю это, результат отображается в одной строке, хотя их несколько. Если я просто запускаю код на Python без HTML, я могу разбить строки. Как показать вывод Paramiko в строках в HTML?

Если я использую этот код ниже, я получаю правильные разрывы строк в HTML, но это вызывает у меня некоторые другие проблемы.

print("Content-type: text/html")
print("")
print("<html><head>")
print("")
print("</head><body>")

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.40.169', username='admin', password='password', port='22')
cmd = '''show run'''
stdin, stdout, stderr = client.exec_command(cmd)
time.sleep(1)
for line in stdout:
    while True:
        line = stdout.readline()
        if not line:
            break
        print(line + '<br />')
print("</body></html>")

Обратите внимание на заголовки HTML и тег 'br /' при печати. Таким образом, это ломает линии. Кроме этого, таким образом я не могу отправлять несколько команд или передавать переменные из PHP в Python. Скрипт их не принимает (не знаю почему ...)

Проблемный скрипт, который принимает передачу переменных PHP, несколько команд SSH за один сеанс, но не разбивает строки, выглядит так:

import threading, paramiko
import time
import sys
#==========================
command = sys.argv[1]
command2 = sys.argv[2]
command3 = sys.argv[3]
command4 = sys.argv[4]
command5 = sys.argv[5]
command6 = sys.argv[6]
command7 = sys.argv[7]
command8 = sys.argv[8]
command9 = sys.argv[9]
command10 = sys.argv[10]
#==========================
print("<html><head>")
print("</head><body>")

class ssh:
    shell = None
    client = None
    transport = None

    def __init__(self, address, username, password):
#        print(("Connecting to server on ip", str(address) + "."))
        self.client = paramiko.client.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
        self.client.connect(address, username=username, password=password, look_for_keys=False)
        self.transport = paramiko.Transport((address, 22))
        self.transport.connect(username=username, password=password)

        thread = threading.Thread(target=self.process)
        thread.daemon = True
        thread.start()

    def close_connection(self):
        if(self.client != None):
            self.client.close()
            self.transport.close()

    def open_shell(self):
        self.shell = self.client.invoke_shell()

    def send_shell(self, command):
        if(self.shell):
            self.shell.send(command + "\n")
        else:
            print("<h1>Shell não aberta.</h1>")

    def process(self):
        global strdata, fulldata
        while True:
            # Print data when available
            if self.shell is not None and self.shell.recv_ready():
                alldata = self.shell.recv(1024)
                while self.shell.recv_ready():
                    alldata += self.shell.recv(1024)
                strdata = strdata + str(alldata)
                fulldata = fulldata + alldata.decode("UTF-8")
                strdata = self.print_lines(strdata) # print all received data except last line

    def print_lines(self, data):
        last_line = data
        if '\n' in data:
            lines = data.splitlines()
            for i in range(0, len(lines)-1):
                print((lines[i]))
            last_line = lines[len(lines) - 1]
            if data.endswith('\n'):
                print(lines.split(last_line))
                last_line = ''
        return last_line

sshUsername = "admin"
sshPassword = "password"
sshServer = "192.168.40.169"

connection = ssh(sshServer, sshUsername, sshPassword)
connection.open_shell()
connection.send_shell(command)
connection.send_shell(command2)
connection.send_shell(command3)
connection.send_shell(command4)
connection.send_shell(command5)
connection.send_shell(command6)
connection.send_shell(command7)
connection.send_shell(command8)
connection.send_shell(command9)
connection.send_shell(command10)
time.sleep(1)
print(fulldata)   # This contains the complete data received.
connection.close_connection()

print("</body></html>")

Я думаю, что мне, вероятно, следует разместить где-нибудь тег 'br /', но я все перепробовал, и он просто не работает. :( Мне действительно нужна помощь с этим.

Вывод должен быть примерно таким:

R5#en
R%#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R5(config)#hostname R5
R5(config)#

Но вот что я получил:

R5#en R5#conf t Enter configuration commands, one per line. End with CNTL/Z. R5(config)#hostname R5 R5(config)#

Простите за большой пост ...

...