Python之网络编程(基于tcp实现远程执行命令)

网友投稿 310 2022-09-16

Python之网络编程(基于tcp实现远程执行命令)

文章目录

​​实现目标​​​​服务端分析​​​​客户端分析​​​​远程执行结果​​

本篇是用tcp套接字实现的一个远程执行命令的小案例,tcp套接字是一种面向连接的Socekt,针对面向连接的TCP服务应用,安全,但是效率低

实现目标

首先客户端输入命令,然后从客户端发送命令,服务端接收客户端发来的命令,并且执行命令,然后返回执行结果给客户端

服务端分析

1、首先是少不了的socket模块;然后考虑到服务端需要执行命令,所以服务端要导入subprocess模块,该模块相当于在shell中输入命令并且执行命令,这里就是用来在windows系统中执行命令的

from socket import *import subprocess#导入subprocess模块,以达到通过命令来执行程序,类似一个shell

2、然后我们需要一个记录服务端ip地址,服务端端口和传输形式的变量

#定义ip地址、端口数、传输形式的变量ip_port = ('192.168.43.247',8080)back_log = 5buffer_size = 1024

3、接着我们要创建一个socket对象,并且绑定上ip地址(自己试验的话就绑定自己电脑的ip地址),然后监听端口

#创建socket对象并且绑定ip地址,然后监听端口tcp_server = socket(AF_INET,SOCK_STREAM)tcp_server.bind(ip_port)tcp_server.listen(back_log)

4、最后就是核心部分了,实现功能的地方。先要接收客户端链接,之后客户端循环遍历收消息,然后执行收到的消息,该消息就是一个命令; 把该命令在服务端的计算机上执行,再将执行结果返回给客户端,就是发消息; 执行完之后就关闭链接,回到循环,继续接收客户端链接,再发消息…

#遍历循环收发消息while True: conn,addr = tcp_server.accept() #接收客户端链接 print('客户端链接为:',addr) #实现远程执行命令 while True: try: #异常处理,主要针对收到空或者其他非法输入 #收取对方发来的命令 cmd = conn.recv(buffer_size) print('客户端发来的命令是:',cmd) #服务端执行命令 res = subprocess.Popen(cmd.decode('utf-8'),shell=True, stderr = subprocess.PIPE, stdout = subprocess.PIPE, stdin = subprocess.PIPE) #先解码收到的命令,再将命令的执行结果(错误信息、输出信息、输入信息)放到PIPE管道里 err = res.stderr.read() #读取错误信息 if err: #判断是否有错误信息,如果有就不进行读取操作(从管道读取到屏幕上) cmd_res = err else: cmd_res = res.stdout.read() #发送消息,即发送远程执行结果 conn.send(cmd_res) except Exception as e: print(e) #输出异常信息 break #并且退出命令的执行 conn.close() #命令执行结束后关闭链接,进入外层循环继续收发消息(链接)

客户端分析

1、首先导入模块,并且定义好链接、端口和发送形式的变量

from socket import *#定义ip地址、端口数、传输形式的变量ip_port = ('192.168.43.247',8080)back_log = 5buffer_size = 1024

2、然后就是建立一个socket对象,并且通过服务端的ip连接上服务端

#建立一个socket对象tcp_client = socket(AF_INET,SOCK_STREAM)tcp_client.connect(ip_port) #链接服务端的ip

3、之后就可以进入主要功能了,就是循环收发消息; 要先让用户输入命令,再将命令发送到服务端,最后接收服务端传回来的消息,也就是命令在服务端执行的结果

#进入循环收发消息while True: cmd = input('请输入您的命令>>>').strip() #输入命令,并将命令去掉空格 if not cmd:continue #如果输入的命令为空,就继续下次循环 if cmd == 'quit': break #如果输入quit就退出循环 #将命令发送到服务端 tcp_client.send(cmd.encode('utf-8')) #接收远程执行结果 cmd_res = tcp_client.recv(buffer_size) print('命令的执行结果是:',cmd_res.decode('gbk')) #打印执行结果,因为是在win系统下,所以结果的默认编码是gbk编码

4、最后,就是关闭客户端与服务端的链接

tcp_client.close() #关闭链接

远程执行结果

可以看到,程序运行正常,需要的功能也实现了。客户端输入dir,该命令的意思是“显示文件列表”,显示程序所在文件夹内的文件信息。可以看到客户端上成功显示出了程序所在文件夹的文件信息

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:公关界007:好爸爸&新世相:用最普通的场景完成一次与有孩家庭的走心对话!
下一篇:elasticsearch交互式命令查询(三)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~