我是 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()