概述
文章目录
- 实现目标
- 服务端分析
- 客户端分析
- 远程执行结果
本篇是用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 = 5
buffer_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 = 5
buffer_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,该命令的意思是“显示文件列表”,显示程序所在文件夹内的文件信息。可以看到客户端上成功显示出了程序所在文件夹的文件信息
最后
以上就是现代电源为你收集整理的Python之网络编程(基于tcp实现远程执行命令)的全部内容,希望文章能够帮你解决Python之网络编程(基于tcp实现远程执行命令)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复