@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府

这篇文章主要介绍了PyQt+socket实现远程操作服务器的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

来需求了。。干活啦。。

需求内容

部分时候由于缓存刷新、验证码显示不出来或者浏览器打不开或者打开速度很慢等原因,导致部分测试同事不想使用浏览器登录服务器执行命令。 期望有小工具可以替代登录浏览器的操作,直接发送指令到服务器执行并将执行结果返回。

需求设计

1、开发界面,方便用户输入IP、用户名、密码以及执行的命令。

2、IP、用户名、密码和命令输入提供默认值。特别是用户名和密码,对于测试服务器来说,通常都是固定的。

3、IP、命令行输入框可以自动补全用户输入。自动补全常用IP、命令行可以提高操作效率。

4、可以自动保存用户执行成功的IP、命令行。用于完善自动补全命令(本文代码未实现)。

需求设计

1、使用Qt Designer实现界面开发。开发后界面参考如下:

2、使用socket程序登录服务器并执行命令,并将结果显示在界面文本框中。

代码实现(程序可以直接复制运行)

1、使用Qt Designer实现界面开发。拖动4个label+4个输入框+1个按钮+1个textBrowser到主界面。开发后界面同需求设计中的截图。

2、使用pyuic5 -o commandtools.py commandtools.ui指令将.ui文件转换成.py文件。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'commandTools.ui'

#

# Created by: PyQt5 UI code generator 5.11.3

#

# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):

def setupUi(self, Form):

Form.setObjectName("Form")

Form.resize(483, 347)

self.ip_label = QtWidgets.QLabel(Form)

self.ip_label.setGeometry(QtCore.QRect(30, 20, 16, 16))

font = QtGui.QFont()

font.setBold(True)

font.setWeight(75)

self.ip_label.setFont(font)

self.ip_label.setObjectName("ip_label")

self.ip_lineEdit = QtWidgets.QLineEdit(Form)

self.ip_lineEdit.setGeometry(QtCore.QRect(50, 20, 101, 20))

self.ip_lineEdit.setObjectName("ip_lineEdit")

self.username_label = QtWidgets.QLabel(Form)

self.username_label.setGeometry(QtCore.QRect(160, 20, 61, 16))

font = QtGui.QFont()

font.setBold(True)

font.setWeight(75)

self.username_label.setFont(font)

self.username_label.setObjectName("username_label")

self.username_lineEdit = QtWidgets.QLineEdit(Form)

self.username_lineEdit.setGeometry(QtCore.QRect(220, 20, 71, 20))

self.username_lineEdit.setObjectName("username_lineEdit")

self.password_label = QtWidgets.QLabel(Form)

self.password_label.setGeometry(QtCore.QRect(300, 20, 61, 16))

font = QtGui.QFont()

font.setBold(True)

font.setWeight(75)

self.password_label.setFont(font)

self.password_label.setObjectName("password_label")

self.password_lineEdit = QtWidgets.QLineEdit(Form)

self.password_lineEdit.setGeometry(QtCore.QRect(360, 20, 80, 20))

self.password_lineEdit.setObjectName("password_lineEdit")

self.command_label = QtWidgets.QLabel(Form)

self.command_label.setGeometry(QtCore.QRect(30, 70, 51, 16))

font = QtGui.QFont()

font.setBold(True)

font.setWeight(75)

self.command_label.setFont(font)

self.command_label.setObjectName("command_label")

self.command_lineEdit = QtWidgets.QLineEdit(Form)

self.command_lineEdit.setGeometry(QtCore.QRect(90, 70, 251, 20))

self.command_lineEdit.setObjectName("command_lineEdit")

self.result_textBrowser = QtWidgets.QTextBrowser(Form)

self.result_textBrowser.setGeometry(QtCore.QRect(30, 120, 410, 201))

self.result_textBrowser.setObjectName("result_textBrowser")

self.run_Button = QtWidgets.QPushButton(Form)

self.run_Button.setGeometry(QtCore.QRect(360, 70, 80, 23))

self.run_Button.setObjectName("run_Button")

self.retranslateUi(Form)

QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self, Form):

_translate = QtCore.QCoreApplication.translate

Form.setWindowTitle(_translate("Form", "cmdTool"))

self.ip_label.setText(_translate("Form", "IP"))

self.ip_lineEdit.setText(_translate("Form", "127.0.0.1"))

self.username_label.setText(_translate("Form", "username"))

self.username_lineEdit.setText(_translate("Form", "admin"))

self.password_label.setText(_translate("Form", "password"))

self.password_lineEdit.setText(_translate("Form", "Winovs12!"))

self.command_label.setText(_translate("Form", "Command"))

self.command_lineEdit.setText(_translate("Form", "LST LOG"))

self.run_Button.setText(_translate("Form", "Run"))

3、实现主程序callcommand.py调用(业务与逻辑分离)。代码如下:

# -*- coding: utf-8 -*-

import sys

import time

import socket

from PyQt5.QtWidgets import QApplication, QMainWindow,QCompleter

from PyQt5.QtCore import Qt,QThread,pyqtSignal

from commandTools import Ui_Form

class MyMainForm(QMainWindow, Ui_Form):

def __init__(self, parent=None):

"""

构造函数

"""

super(MyMainForm, self).__init__(parent)

self.setupUi(self)

self.run_Button.clicked.connect(self.execte_command)

self.ip_init_lst = ['121.1.1.1', '192.168.1.1', '172.16.1.1']

self.init_lineedit(self.ip_lineEdit,self.ip_init_lst)

self.cmd_init_lst = ['LST LOG', 'LST PARA','MOD PARA']

self.init_lineedit(self.command_lineEdit,self.cmd_init_lst)

def init_lineedit(self, lineedit, item_list):

"""

用户初始化控件自动补全功能

"""

# 增加自动补全

self.completer = QCompleter(item_list)

# 设置匹配模式 有三种: Qt.MatchStartsWith 开头匹配(默认) Qt.MatchContains 内容匹配 Qt.MatchEndsWith 结尾匹配

self.completer.setFilterMode(Qt.MatchContains)

# 设置补全模式 有三种: QCompleter.PopupCompletion(默认) QCompleter.InlineCompletion QCompleter.UnfilteredPopupCompletion

self.completer.setCompletionMode(QCompleter.PopupCompletion)

# 给lineedit设置补全器

lineedit.setCompleter(self.completer)

def execte_command(self):

"""

登录服务器,并执行命令

"""

ip, username, password, command = self.get_input_para()

print(type(ip))

sockethandle = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sockethandle.connect((str(ip), 6000))

send_cmd = "username: %s, admin: %s, command: %s" % (username, password, command)

print(send_cmd)

sockethandle.sendall(send_cmd.encode('utf-8'))

time.sleep(0.5)

recdata = sockethandle.recv(65535)

tran_recdata = recdata.decode('utf-8')

self.result_textBrowser.setText(tran_recdata)

def get_input_para(self):

"""

获取用户界面输入

"""

ip = self.ip_lineEdit.text()

username = self.username_lineEdit.text()

password = self.password_lineEdit.text()

command = self.command_lineEdit.text()

return ip, username, password, command

if __name__ == "__main__":

app = QApplication(sys.argv)

myWin = MyMainForm()

myWin.show()

sys.exit(app.exec_())

4、使用pyinstaller转换成可执行的.exe文件。命令: pyinstaller -F callcommand.py -w

执行成功,生成的文件在d:\temp\dist\dist\callcommand.exe

5、运行callcommand.exe,点击run运行

关键代码

1、输入框自动补全功能函数。同样适用于下拉框控件。

def init_lineedit(self, lineedit, item_list):

"""

用户初始化控件自动补全功能

"""

# 增加自动补全

self.completer = QCompleter(item_list)

# 设置匹配模式 有三种: Qt.MatchStartsWith 开头匹配(默认) Qt.MatchContains 内容匹配 Qt.MatchEndsWith 结尾匹配

self.completer.setFilterMode(Qt.MatchContains)

# 设置补全模式 有三种: QCompleter.PopupCompletion(默认) QCompleter.InlineCompletion QCompleter.UnfilteredPopupCompletion

self.completer.setCompletionMode(QCompleter.PopupCompletion)

# 给lineedit设置补全器

lineedit.setCompleter(self.completer)

2、socket中sendall函数要将命令使用utf-8编码,否则会导致界面卡住:

sockethandle.sendall(send_cmd.encode('utf-8'))

3、需要将命令返回的内容解码再写入文本框,否则会导致界面卡住。

recdata = sockethandle.recv(65535)

tran_recdata = recdata.decode('utf-8')

self.result_textBrowser.setText(tran_recdata)

附录

由于本地没有服务器用于调试程序。所以使用socket搭建1个建议服务器。服务器功能实现将接收的命令原样返回。就是接收什么命令就给客户端返回什么内容。服务器IP为本地IP127.0.0.1,绑定端口为6000。代码如下:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import socket

import sys

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

print("socket create success!")

try:

s.bind(('127.0.0.1',6000))

except socket.error as msg:

print(msg)

sys.exit(1)

s.listen(10)

while True:

conn, addr = s.accept()

print("success")

data = conn.recv(65535)

conn.sendall(data.decode('utf-8'))

conn.close()

s.close()

启动服务器:

简陋的有点过分,但是满足调试需求了。。。

小结

这个python+scoket需求实现的远程登录服务器执行命令只是把基本功能实现了。中间遇到的界面无响应甚至退出的问题(就是socket发送和接收内容编解码导致的)。。但是还有很多地方需要优化,比如对入参的判断并输出到文本框提示、对连接服务器结果的判断,还有界面的美化等内容。

非常感谢你的阅读

大学的时候选择了自学python,工作了发现吃了计算机基础不好的亏,学历不行这是没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习python核心知识,深入的研习计算机基础知识,整理好了,我放在我们的微信公众号《程序员学府》,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!

其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?

[点击加入]

想做你自己想成为高尚人,加油!

服务器可以pyqt显示吗,用pyqt+socket实现远程操作服务器的一个例子,PyQtsocket,方法,示例...相关推荐

  1. ESP8266配网并将IP显示至oled液晶屏 ESP8266远程连接服务器控制灯或继电器

    智能车与机器人技术交流平台 概述 可能已经有人很熟练的编写ESP8266程序,但是因为我学习运用的时间也就一周左右,踩了好多坑,所以不喜就不要看勿喷.文章仅此分享交流一些经验,供此参考. 主要做的工作 ...

  2. 连接服务器显示出现内部错误怎么解决方案,远程连接服务器提示“出现了内部错误”解决方法锐讯网络罗海清...

    远程连接服务器提示"出现了内部错误"解决方法: 解决方法: Win+R键 打开DOS窗口 输入"ncpa.cpl"并敲击回车 紧接着会看到"本地连接& ...

  3. 服务器里的文件删了能恢复吗,远程把服务器文件删了怎么恢复

    远程把服务器文件删了怎么恢复 内容精选 换一换 按需购买的两台同类型弹性云服务器(操作系统类型相同,如Windows和Windows,Linux和Linux),关机卸载系统盘后,重新挂载至对方弹性云服 ...

  4. 怎么用git将本地代码上传到远程服务器_TortoiseGit将本地git仓库上传到远程git服务器方法...

    以前为了图省事,通过TortoiseGit创建本地仓库(与git服务器无连接),对于个人使用确实比较方便,commit,revert,diff之类的功能都能够使用,并且速度也很快的.代码开发到一定阶段 ...

  5. python将源代码转换成在html可显示的格式,Python实现将HTML转换成doc格式文件的方法示例...

    Python实现将HTML转换成doc格式文件的方法示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python实现将HTML转换成doc格式文件的方法示例. ...

  6. 远程服务器怎么能显示电脑u盘,怎样在远程服务器上看到u盘

    怎样在远程服务器上看到u盘 内容精选 换一换 将文件上传至Windows云服务器一般会采用MSTSC远程桌面连接的方式.本节为您介绍本地Windows计算机通过远程桌面连接,上传文件至Windows云 ...

  7. 战地3服务器网络不显示,战地3今天更新了?发现服务器进不去了,贴个官方消息。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 -- Balance and Gameplay Adjustments (PC) • Fixed a problem with high speed mo ...

  8. 我的世界服务器为什么一直显示游戏运行中,我的世界网易版进不去解决方法 MC网易电脑端进不去原因...

    虽然网易版的国服我的世界是免费的,但是还是有些问题值得吐槽,就是会出现游戏登录不上去,本期为大家带来的就是我的世界网易版进不去解决方法及MC网易电脑端进不去原因! 我的世界网易版进不去解决方法 MC网 ...

  9. 使用 IPMI 远程操作服务器

    需要注意的一点是,每操作一次,就需要重新下载一次launch.jnlp 而且操作的同时要保证浏览器的网页一直处于打开状态 1.输入https://192.168.19.95/ 用户名和密码都是ADMI ...

最新文章

  1. Android Activity的生命周期、意图(Intent)
  2. 剑指offer之先序非递归打印二叉树
  3. HDOJ(HDU) 1994 利息计算(简单题目)
  4. 使用pyinstaller把pyton文件打包成exe文件
  5. 掌握 git reset 使用
  6. IntelliJ中可能的东西在Eclipse中是不可能的?
  7. cognos ibm 收购_IBM Cognos与Linux上的Sterling Selling and Fulfillment Suite集成
  8. 谷歌浏览器书签丢失,恢复工具
  9. Litestar 4D:道路照明
  10. 无人驾驶入门1:无人驾驶概览
  11. 安装旧版本gcc的简便方法,软件包管理命令update-alternatives使用
  12. vue图片裁剪:使用vue-cropper做图片裁剪
  13. ios游戏和android,20款最受好评的iOS和Android游戏
  14. ospf路由器连接物理网络的方式 以及ospf与IGRP对比(补充)
  15. 将windows里的内容直接复制粘贴到ubuntu,提高效率
  16. 视频监控ai分析系统 yolo
  17. narak 靶机实验实战演练
  18. 最新版FusionCharts2D面积图
  19. 如何删除mysql数据库的重复数据
  20. 数据分析课后作业--信用卡客户风险评价(代码)

热门文章

  1. WebGL Shader 环境搭建
  2. 让Redis突破内存大小的限制
  3. 数据库索引背后的数据结构
  4. Nginx与Tomcat实现请求动态数据与请求静态资源的分离
  5. 从OpenStack Newton发布看开源云计算
  6. 在leangoo里怎么复制删除列表?
  7. Nginx 日志文件切割
  8. [公告]博客园新服务器照片
  9. Python LDA主题模型实战
  10. clip\_gradient