0

我是 Python 新手。我正在服务器上执行命令并将其输出写入文件和 tkinter 文本。代码如下。有没有办法使用 tkinter 编写实时输出?现在,在执行完所有命令后,会弹出一个带有输出的文本窗口。正如我sessionoutput.mainloop()在 for 循环之后所写的那样。请提出任何同时执行此操作的方法(请参阅频道正在提供输出并在 tkinter 文本上打印实时输出)。

最终,我将创建 2 组并行运行的命令。所以我不能只使用命令行输出,因为当我们使用线程时,两个会话的输出会混淆。所以我需要一个单独的窗口来显示输出。

import paramiko
import sys
import time
import tkinter

def connect_to_ssh():   
    hostname_ip = "1.1.1.1"
    username = "admin"
    password = "admin"

    output_file = open("singlerunOutput.txt", "a+")
    port = 22
    #exception handling
    i = 0
    while True:
        try:
            ssh = paramiko.SSHClient()
            ssh.load_system_host_keys()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(hostname_ip, 22, username, password)
            break
        except paramiko.AuthenticationException:
            print("Authentication failed when connecting to %s" % hostname_ip)
            sys.exit(1)
        except:
            print("Could not SSH to %s, waiting for it to start" % hostname_ip)
            i += 1
            time.sleep(2)
        if i == 30:
            print("Could not connect to %s. Giving up" % hostname_ip)
            sys.exit(1)

    print("\n****** Connection Successful ******")

    output_cmd_list = list()
    cmd1 ="config vdom"
    cmd2 ="edit Test"
    cmd3 ="diag sniffer packet any 100 l"
    cmd5 = "end"   
    output_cmd_list.append(cmd1)
    output_cmd_list.append(cmd2)
    output_cmd_list.append(cmd3)
    output_cmd_list.append(cmd5)
    sessionoutput = tkinter.Tk()
    sessionoutput.wm_title("outputwindow")
    sessionoutput.geometry("600x400")  # w and h
    sessionop_text = tkinter.Text(sessionoutput, height=600, width=400)
    session_output_tab = tkinter.Scrollbar(sessionoutput)
    session_output_tab.pack(side=tkinter.RIGHT, fill=tkinter.Y)
    session_output_tab.config(command=sessionop_text.yview)
    sessionop_text.pack(side=tkinter.LEFT, fill=tkinter.Y)


    channel = ssh.invoke_shell()

    for command in output_cmd_list:
        channel.send(command + '\n')
        time.sleep(3)
        channel.send(chr(3))  # CTRL+C
        outlines = channel.recv(10240).decode("ascii")
        sessionop_text.insert(tkinter.END, outlines)
        print(outlines)
        output_file.write(outlines)

    sessionoutput.mainloop()
    channel.close()
    ssh.close()
    output_file.close()


if __name__ == '__main__':
    connect_to_ssh()
4

0 回答 0