使用qt实现主界面,python的paramiko实现连接服务器+显示日志文件更新命令,paramiko是ssh的python库,使用很方便,其实基于C++的ssh开发库也有很多,但是需要花费一些时间进行编译才能用,所有选择使用paramiko实现日志抓取功能,使用qt实现界面功能,使用QProcess进行python程序调用,本来要使用QProcess与python进程通信,但是只实现了单向的获取python输出,向python进程写内容失败,没有找到问题在哪,所以就改变了通信方式为socket,日志输出在python程序中使用socketserver,qt客户端连接到python服务器就可以接收到实时的日志更新,这种实现方式不是很好,但是让我最快的实现功能,每一部分代码都很简单,刚学习python,代码大部分网上复制的,算是记录一个练手的小程序。
import socketserver
import paramiko
import select
import sys
import os
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
self.request.sendall(b"hello qt")
try:
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('9.9.9.107', port=22,username='root', password='123456')
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command("tail -f /var/log/***.log")
except:
sys.stdout.write("python exit")
sys.stdout.flush()
os._exit(0)
while True:
try:
rl, wl, xl = select.select([channel],[],[],0.0)
if len(rl) > 0:
# Must be stdout
result = channel.recv(64)
if len(result) == 0:
break
try:
self.request.sendall(result)
except:
print("Connection Error")
client.get_transport().open_session().exec_command("kill -9 `ps -ef | grep 'tail -f /var/log/***.log' | grep -v grep | awk '{print $2}'`")
client.close()
sys.stdout.write("python exit")
sys.stdout.flush()
os._exit(0)
break
except KeyboardInterrupt:
print("Caught control-C")
channel.close()
try:
#open new socket and kill the proc..
client.get_transport().open_session().exec_command("kill -9 `ps -ef | grep 'tail -f /var/log/***.log' | grep -v grep | awk '{print $2}'`")
pass
except:
pass
client.get_transport().open_session().exec_command("kill -9 `ps -ef | grep 'tail -f /var/log/***.log' | grep -v grep | awk '{print $2}'`")
client.close()
exit(0)
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',1208),MyServer)
server.serve_forever()