您的位置:首页 > 编程语言 > Python开发

Python进阶者笔记(基于tcp实现远程执行命令)

2020-03-25 18:34 323 查看

文章目录


本篇是用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,该命令的意思是“显示文件列表”,显示程序所在文件夹内的文件信息。可以看到客户端上成功显示出了程序所在文件夹的文件信息

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
栀丶子 发布了33 篇原创文章 · 获赞 75 · 访问量 9342 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: