python套接字编程实现ntp服务和远程命令执行

目录

基于udp实现ntp服务
基于tcp实现远程命令执行
基于udp实现远程命令执行
tcp与udp的比较

  

前面关于套接字基础请查阅

https://www.cnblogs.com/-wenli/p/10173888.html

基于udp实现ntp服务

服务端

import time
from socket import * def main():
ip_port = ('127.0.0.1', 4444)
buffer_size = 1024 s1 = socket(AF_INET,SOCK_DGRAM) #数据报
s1.bind(ip_port) while True:
data,addr= s1.recvfrom(buffer_size)
if not data:
fmt = '%Y-%m-%d %X' #udp服务可以接收空信息,如果为空信息,则为默认格式
else:
fmt = '%'+data.decode('utf-8') #自定义格式 back_time=time.strftime(fmt)
s1.sendto(back_time.encode('utf-8'),addr) if __name__ =='__main__':
main()

客户端

from socket import *

def main():
ip_port = ('127.0.0.1', 4444)
buffer_size = 1024 s2 = socket(AF_INET,SOCK_DGRAM) #数据报
print('请输入回车获取当前完整时间,Y获取当前年份,m获取当前月份,,d获取当前日期,X获取当前时间')
while True:
data = input('-->:')
s2.sendto(data.encode('utf--8'),ip_port) #udp发信息没有链接,所以每一个发送信息都需要指定ip和端口 data1,addr=s2.recvfrom(buffer_size) print('标准时间:',data1.decode('utf-8')) if __name__ =='__main__':
main()

  

运行结果

基于tcp实现远程执行命令

服务端

from socket import  *
import subprocess def main():
ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024 s1 = socket(AF_INET,SOCK_STREAM)
s1.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s1.bind(ip_port)
s1.listen(back_log) while True:
conn,addr=s1.accept() while True:
try:
#收信息
cmd = conn.recv(buffer_size)
if not cmd:break
print('收到的命令是:',cmd.decode('utf-8')) #执行命令
res = subprocess.Popen(cmd.decode('utf-8'),shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE) err = res.stderr.read()
if err:
cmd_res=err
else:
cmd_res=res.stdout.read() #发信息
#注意:执行的结果默认jbk编码方式,所以客户端必须使用gbk方式解码
conn.send(cmd_res) except Exception:
break
conn.close()
s1.close() # 关闭服务端套接字 if __name__ == '__main__':
main()

  

客户端

from socket import  *

def main():
ip_port=('127.0.0.1',8080)
buffer_size=2048 s1 = socket(AF_INET,SOCK_STREAM)
s1.connect(ip_port) while True:
cmd = input('-->')
if not cmd:continue
if cmd =='quite':break
s1.send(cmd.encode('utf-8')) reponse = s1.recv(buffer_size)
print('命令执行结果:',reponse.decode('gbk')) s1.close() if __name__=='__main__':
main()

  

补充知识

补充: 你从管道中读取输出,只能读取一次,输出到屏幕,管道里面的数据就会取出来
res=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE) 第一个参数为命令,第二个参数为shell=Ture,意思是使用shell作为命令解释器去解释前面的命令,后面是重定向标准输入和标准输出以及错误输出
(默认输出到屏幕)
res.stdout.read()  从管道读取结果
res.stderr.read() 从管道读取错误
res.stdin.read() 从管道读取输入 这个程序解决两个问题:
客户端正常断开连接,在服务端加上if not cmd:break,判断接收信息为空就结束接收信息的循环,继续等待下一次连接,正常情况,服务端不会接收到空。
客户毒案异常中断,在服务端上加上异常处理

运行结果

基于udp实现远程执行命令

服务端

from socket import *

import subprocess

def main():
ip_port = ('127.0.0.1', 9003) bufsize = 1024 udp_server = socket(AF_INET, SOCK_DGRAM) udp_server.bind(ip_port) while True:
try:
# 收消息 cmd, addr = udp_server.recvfrom(bufsize) print('用户命令----->', cmd.decode('utf-8')) # 逻辑处理 res = subprocess.Popen(cmd.decode('utf-8'), shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE) err = res.stderr.read()
if err:
cmd_res = err
else:
cmd_res = res.stdout.read()
if not cmd_res:
cmd_res = '执行成功'.encode('gbk') # 发信息
# 注意:执行的结果默认jbk编码方式,所以客户端必须使用gbk方式解码
udp_server.sendto(cmd_res,addr)
except Exception:
break if __name__=='__main__':
main()

  

客户端

from socket import *

def main():
ip_port=('127.0.0.1',9003) buffer_size=1024
udp_client=socket(AF_INET,SOCK_DGRAM) while True:
cmd = input('-->')
if not cmd: continue
if cmd == 'quite': break
udp_client.sendto(cmd.encode('utf-8'),ip_port)
reponse,addr = udp_client.recvfrom(buffer_size)
print('命令执行结果:', reponse.decode('gbk'))
udp_client.close() if __name__=='__main__':
main()

  

运行结果

tcp与udp的比较

tcp基于链接通信

基于链接,则需要listen(backlog),指定连接池的大小
基于链接,必须先运行的服务端,然后客户端发起链接请求
对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)
udp无链接 无链接,因而无需listen(backlog),更加没有什么连接池之说了
无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
只有sendinto发送数据没有recvfrom收数据,数据丢失

  

python套接字编程实现ntp服务和远程命令执行的更多相关文章

  1. python套接字编程基础

    python套接字编程 目录 socket是什么 套接字的工作流程 基于tcp的套接字 基于udp的套接字 socket是什么 客户端/服务器架构(C/S架构) 服务端:提供服务的一端 客户端:请求服 ...

  2. Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 1. socket模块与基本套接字编程 2. socket模块的其他网络编程功能 3. SocketServer模块与简单并发服务器 4. 异步编程 ...

  3. python开发socket套接字:套接字&通信循环&链接循环&模拟远程命令

    一,套接字 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket ...

  4. 入门级:怎么使用C#进行套接字编程(二)

    入门级:怎么使用C#进行套接字编程(一) 原文地址如下: C# Server Socket program C# Client Socket program 代码环境:VS2010+Win8.1企业评 ...

  5. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  6. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  7. UDP,TCP的套接字编程的Python实现

    UDP,TCP的套接字编程的Python实现 套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型 ...

  8. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

  9. Python 3中套接字编程中遇到TypeError: 'str' does not support the buffer interface的解决办法

    转自:http://blog.csdn.net/chuanchuan608/article/details/17915959 目前正在学习python,使用的工具为python3.2.3.发现3x版本 ...

随机推荐

  1. Mask RCNN 学习笔记

    下面会介绍基于ResNet50的Mask RCNN网络,其中会涉及到RPN.FPN.ROIAlign以及分类.回归使用的损失函数等 介绍时所采用的MaskRCNN源码(python版本)来源于GitH ...

  2. Linux的记事本 Vi和Vim

    ⒈Vi和Vim的三种模式 ①正常模式 在正常模式下可以使用快捷键 默认进入的是正常模式 ②编辑模式(插入模式) 在该模式下可以输入内容 按下I,i,O,o,A,a,R,r等任何一个字母之后才可以进入该 ...

  3. kset学习demo以及Oops反汇编objdump调试例子【原创】

    写一个main.c gcc -c -g main.c objdump -S main.o > b.txt arm-none-linux-gnueabi-gcc -c -g a.c arm-non ...

  4. xpath路径前可用方法测试

    $x("string-length(//h3[@class='t'])") 8 $x("string(//h3[@class='t'])") "XPa ...

  5. ES系列目录

    ES系列一.CentOS7安装ES 6.3.1 ES系列二.CentOS7安装ES head6.3.1 ES系列三.基本知识准备 ES系列四.ES6.3常用api之文档类api ES系列五.ES6.3 ...

  6. Vue.js——常用的指令

    1.v-on:指令监听DOM事件,并在触发时运行一些javaScript代码. <div id='myView'> <img src="img/se.png" v ...

  7. JavaScript中unicode编码与String互转(三种方法)

    1.引言 JS本身就支持unicode转string功能,一共有三种方式和String单个字符转unicode编码. 2.方法 //unicode转String 1. eval("'&quo ...

  8. redux最佳实践

     对于初学者,redux的理念很难理解.其实redux并不难,redux核心理念就是数据仓库,所有数据操作来源都是明确的.只不过不是直接操作数据,而是交给特定的角色做特定的工作,分工明确.   pro ...

  9. Python源码学习(一)

    考虑到性能的要求,我在工作中用的最多的是c/c++,然而,工作中又经常会有一些验证性的工作,这些工作对性能的要求并不高,反而对完成的效率要求更高,对于这样的工作,用一种开发效率高的语言是合理的想法,鉴 ...

  10. 完全背包记录路径poj1787 好题

    这题有点多重背包的感觉,但还是用完全背包解决,dp[j]表示凑到j元钱时的最大硬币数,pre[j]是前驱,used[j]是凑到j时第i种硬币的用量 △回溯答案时i-pre[i]就是硬币价值 #incl ...