玖叶教程网

前端编程开发入门

Python Paramiko与Tk实现SSH客服端

前言

Paramiko是一个用于实现SSHv2协议的Python库,它可以用于远程连接和管理服务器。Tkinter是Python的一个标准GUI库,可以用来创建图形用户界面。

使用Paramiko和Tkinter结合,可以实现一个简单的SSH客服端程序。这个程序可以连接到远程服务器,执行命令,并在本地显示输出结果。

现如今很多智能设备都是基于linux开发的,基本都是带有ssh协议,特别是在工厂生产的时候,需要执行特殊的指令,可以把特殊的指令集成在工具里面,方便快捷的使用,而且还可以让工厂的人傻瓜式的操作,非常的方便。

这个程序会创建一个图形界面,可以输入ip地址,用户名,密码,端口,有三个button,“连接”用来连接远程服务器,连接成功会有弹出提示框,连接成功;“清空日志”,清除下面打印的执行命令的日志;“查询”执行前面输入的命令

完整代码如下:

import os
import time
import tkinter as tk
from tkinter import scrolledtext, BOTH, END, INSERT
import paramiko
from tkinter import messagebox
import threading


class SSHTool:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("SSH工具")
        self.root.geometry("600x480")
        self.root.resizable(False, False)


        self.ssh = None


        self.f1 = tk.Frame(self.root)
        tk.Label(self.f1, text="地址:").grid(row=0, column=0)
        self.ip = tk.Entry(self.f1, width=15)
        self.ip.insert(0, "192.168.145.131")
        self.ip.grid(row=0, column=1)


        tk.Label(self.f1, text="用户:").grid(row=0, column=2)
        self.u_name = tk.Entry(self.f1, width=6)
        self.u_name.insert(0, "kali")
        self.u_name.grid(row=0, column=3)


        tk.Label(self.f1, text="密码:").grid(row=0, column=4)
        self.passwd = tk.Entry(self.f1, width=12)
        self.passwd.insert(0, "kali")
        self.passwd.grid(row=0, column=5)


        tk.Label(self.f1, text="端口:").grid(row=0, column=6)
        self.port = tk.Entry(self.f1, width=6)
        self.port.insert(0, "22")
        self.port.grid(row=0, column=7)


        tk.Button(self.f1, text="连接", width=4, command=self.connect).grid(row=0, column=8, padx=10, pady=5)
        tk.Button(self.f1, text="清空日志", width=8, command=self.clear_log).grid(row=0, column=9, padx=10, pady=5)


        self.f1.grid()


        self.f2 = tk.Frame(self.root)
        cmd = tk.Label(self.f2, text="执行命令:")
        cmd.grid(row=0, column=0)
        self.inp = tk.Entry(self.f2, width=60)
        self.inp.insert(0, "pwd")
        self.inp.grid(row=0, column=1)


        tk.Button(self.f2, text="查询", width=8, command=self.query).grid(row=0, column=2, padx=10, pady=5)


        self.f2.grid()


        self.f4 = tk.Frame(self.root)


        self.text = scrolledtext.ScrolledText(self.f4)
        self.text.pack(side="bottom", fill=BOTH)
        self.f4.grid()


    def connect(self):
        ip_addr: str = self.ip.get()
        pwd: str = self.passwd.get()
        l_port: int = int(self.port.get())
        username: str = self.u_name.get()
        global ssh
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            ssh.connect(hostname=ip_addr, port=l_port, username=username, password=pwd, timeout=3)
            messagebox.showinfo('提示', "连接成功")
        except Exception as e:
            messagebox.showinfo('提示', "连接超时,请检查设备是否连接好及其IP地址&密码的正确性")
            return 0




    def query(self):
        """
        执行命令
        """
        cmds = self.inp.get()
        stdin, stdout, stderr = ssh.exec_command(cmds)
        content = f"{stdout.read().decode()}"
        self.insert_text(cmds, content)


    def insert_text(self, cmds, content):
        """
        :param cmds:执行命令
        :param content: 返回的结果
        :return: None
        插入的文本,滚动条滚动到最新的那条
        """
        self.text.insert(INSERT, f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}-->>>执行命令:{cmds},返回结果:\n{content}\n")
        self.text.see(END)


    def clear_log(self):
        """
        清空显示的日志
        """
        self.text.delete(0.0, END)
        messagebox.showinfo('提示', "日志已经清空")


    def run(self):
        self.root.mainloop()


if __name__ == "__main__":
    tool = SSHTool()
    tool.run()



总结

这个只是一个最简单的使用paramiko库+GUI TK库实现的,一个执行命令的GUI程序,当然你也可以根据自己的需求去定制自己的命令,也可以在里面增加上传跟下载文件的功能 ,上传跟下载功能可以参考这篇Paramiko:一个非常实用的Python库

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言