我是靠谱客的博主 现代电源,最近开发中收集的这篇文章主要介绍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 = 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实现远程执行命令)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部