zoukankan      html  css  js  c++  java
  • python练习-Socket实现远程cmd命令

    需求:基于tcp的套接字实现远程执行命令的操作

    代码示例:

     1 # 编辑者:闫龙
     2 #Client端部分
     3 import socket #导入骚凯特模块
     4 CmdObj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#实例化骚凯特对象
     5 #基于网络类型(AF_INET)的套接字,基于TCP协议(SOCK_STREAM)
     6 CmdObj.connect(("127.0.0.1",5741))#建立与服务端的通信
     7 print(CmdObj.recv(1024).decode("utf8"))#显示服务端的欢迎信息
     8 while True:
     9     CmdScript = input(">>>:")#写入想要执行的cmd命令
    10     if not CmdScript: continue #判断是否为空,避免服务端出现循环错误
    11     if(CmdScript == "exit"):#先判断是否退出,如果不退出则继续执行
    12         print("感谢使用,再见!")
    13         break
    14     CmdObj.send(CmdScript.encode("utf8"))#将cmd命令转为bytes传输给服务端
    15     Recv = CmdObj.recv(1024)#接收服务端传来的bytes信息
    16     try:
    17         print(Recv.decode("gbk"))
    18         #尝试将bytes信息使用gbk方式编码,在windows下的编码是gbk,不过如果编码错误的话还可以通过捕获异常来重新编码
    19     except UnicodeDecodeError as ude:#判断异常为转码异常
    20         print(Recv.decode("utf8"))#使用utf8编码bytes信息(这里其实就是为了返回服务端对egon进行处理的那条信息)
    客户端代码
     1 # 编辑者:闫龙
     2 import socket,subprocess#导入骚凯特模块和命令行交互模块
     3 CmdObj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     4 #实例化骚凯特对象,基于网络类型(AF_INET)的TCP流传输(SOCK_STREAM)
     5 CmdObj.bind(("127.0.0.1",5741))#建立服务端的绑定信息服务IP是127.0.0.1,端口号是5741
     6 CmdObj.listen(5)#建立监听,后备链接最大值为5
     7 while True:
     8     Clients,ClientIP = CmdObj.accept()#等待客户端的连接.........
     9     #并获得连接句柄Clients,和连接地址信息ClientIP
    10     Clients.send(("您当前的登陆IP地址为:%s"%(ClientIP[0])).encode("utf8"))
    11     #发送给客户端欢迎信息
    12     while True:
    13         try:
    14             CmdScript = Clients.recv(1024)#接收客户端传来的bytes数据
    15             if not CmdScript : continue#如果为空跳出本次循环,避免服务端和粗线死循环情况
    16             if(CmdScript.decode("utf8") == "egon"):#这里是个趣味性代码,认真学习者可忽略
    17                 Clients.send("SomeBody不是一个有效的dos命令!".encode("utf8"))
    18                 continue
    19             Res = subprocess.Popen(CmdScript.decode("utf8"),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    20             #实例化subprocess对象,获得由客户端发来的命令执行后的结果
    21             ResData = Res.stdout.read()#读取命令执行成功的结果
    22             if not ResData:#如果读取命令执行成功的结果失败
    23                 ResData = Res.stderr.read()#则读取命令执行失败的结果
    24             Clients.send(ResData)#将结果返回给客户端,这里由于是在windows下所以默认的bytes编码格式是gbk
    25         except Exception as  e:
    26             print(e)
    27             break
    28     Clients.close()
    29 CmdObj.close()
    服务器端代码

    以上,仅供参考,还是希望大家可以写出属于自己的完美代码

  • 相关阅读:
    博客园 Open Live Writer 博客编辑工具&代码高亮显示插件 安装使用说明
    测试高亮代码
    Linux 查看操作系统版本信息 uname
    Linux 查看登录用户信息 who & whoami
    Linux crontab 每5秒钟执行一次 shell 脚本 的方法
    Linux 查找特定程序 whereis
    Java 语言实现 MD5 加密
    Maven 官网 查找&下载 jar包& pom引用 完美方案
    ArcGIS Engine 10.x许可代码
    IIS 无法显示网页 目前访问网站的用户过多
  • 原文地址:https://www.cnblogs.com/DragonFire/p/6804834.html
Copyright © 2011-2022 走看看