前言
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库