原则:发送一个接受一个

原理:发送执行命令的大小给客户端,客户端根据接受的大小判断是否全部接收了服务器sendall()发送的全部

利用send发送的全部数据都是bytes类型的,需要进行字符编码的转换,因为中文环境,所以需要转换GBK查看

客户端:

# 客户端
import socket # family=AF_INET, 代表使用IPV4的IP协议
# type=SOCK_STREAM 代表使用TCP协议进行连接
client = socket.socket()
ip_addr = ('127.0.0.1', 9999)
try:
client.connect(ip_addr)
exit_flag = True
while exit_flag:
# 发送一定要有接收
inp = input('>>>:')
if inp != 'bye':
client.send(bytes(inp, 'utf-8'))
exit_flag = True
else:
client.send(bytes(inp, 'utf-8'))
exit_flag = False
result_len = int(str(client.recv(1024), encoding='utf-8')) # 接受服务器端发送的数据大小
print('客户端接收的大小为:', result_len)
data_size = bytes()
while len(data_size) != result_len:
info = client.recv(1024) # 最大接收1024K数据,# 传送/接收的数据一定是byte类型
data_size += info
print('客户端:', str(data_size, 'gbk')) # Win7系统就是GBK编码返回的数据
except Exception as e:
print('客户端关闭连接', e)
finally:
client.close()

服务端:

# 服务端
import socket
import subprocess
# family=AF_INET, 代表使用IPV4的IP协议
# type=SOCK_STREAM 代表使用TCP协议进行连接
server = socket.socket() # 创建socket
ip_addr = ('127.0.0.1', 9999) # 1024之前的端口,默认是OS使用
server.bind(ip_addr) # 要求必须是一个元组
server.listen(3) # 开始监听传入连接。在拒绝连接之前,可以挂起的最大连接数量。
while True:
conn, addr = server.accept() # 接受连接并返回(conn,address)
# 其中conn是新的套接字对象[客户端],可以用来接收和发送数据。
# address是连接客户端的地址。
exit_flag = True
while exit_flag:
print('当前连接对象', addr)
# 发送一定要有接收
data = conn.recv(1024)
print('服务器:', str(data, 'utf-8'))
obj = subprocess.Popen(str(data, 'utf-8'), shell=True, stdout=subprocess.PIPE)
cmd_result = obj.stdout.read() # 编码用GBK,默认在当前文件所在的文件路径
conn.sendall(bytes(str(len(cmd_result)), encoding='utf-8')) # 发送数据大小,int不能直接转换为bytes
print('服务器发送的大小为:', len(cmd_result)) # 某种程度上解决了粘包现象
conn.sendall(cmd_result) # 发送全部的数据
server.close()

注意:  粘包现象: 在服务器端连续send()的时候,2个send直接会等待很短的时间,所以导致传递过去的len会报错,因为不能转换为int型,可以利用Time.sleep解决,也可以遵循一收一发的原则,发送一个以后在发送一次解决。

Python学习---远程执行命令的更多相关文章

  1. python案例远程执行命令

    ------类似于cmd的功能,client执行命令,server发命令结果发送到client -----------server.py------------------- import subpr ...

  2. Python ssh 远程执行shell命令

    工具 python paramiko 远程执行命令 import paramiko ssh = paramiko.SSHClient() key = paramiko.AutoAddPolicy() ...

  3. 【Python】模块学习之使用paramiko连接Linux,远程执行命令,上传下载、文件

    本文主要介绍paramiko远程执行linux命令,及在服务器上进行文件的上传.下载 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. ...

  4. python之实现批量远程执行命令(堡垒机)

    python远程批量执行 我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁. 前段时间一个同学找我一起做一个自动化运维平台,我对pytho ...

  5. Python之路 - Socket实现远程执行命令

    Python之路 - Socket实现远程执行命令 os模块实现

  6. python 网络编程(远程执行命令与粘包)

    远程执行命令 先来学习一个新模块 , 一会用到的.. 新模块: subprocess 执行系统命令 r = subprocess.Popen('ls',shell=True,stdout=subpro ...

  7. Python Paramiko实现sftp文件上传下载以及远程执行命令

    一.简介 Paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令.文件传输等功能. 安装模块 默认Python没有自带,需要手动安装: pip3 install par ...

  8. 一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)

    作为一个后台程序猿,经常需要把一堆程序集(DLL)或者应用程序(EXE)复制到多个服务器上,实现程序的代码逻辑更新,用以测试新的功能或改动逻辑.这里给大家介绍一个自己实现的PowerShell脚本,方 ...

  9. 使用paramiko远程执行命令、下发文件

    写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...

随机推荐

  1. django中多个字段的模糊查询

    django中多个字段的模糊查询 使用Entity.objects.filter(name_contains='kris').filter(address='beijing') 这个方法是指名字包含k ...

  2. 用.net 2.0(或.net 3.5)开发的程序在.net 4.0的环境中运行的解决方案

    引用:.NET2.0程序集无法在.net 4.0 中运行的解决方案 1. 原来是在.net 2.0 (VS2008)的环境下的程序,通过升级到.net 4.0 (VS2013)导致程序运行不了 提示需 ...

  3. 正则表达式识别字符串中的URL

    一般我们经常看到一些在帖子或者别人的文章里,文字中间还会夹带着很多的网址还有URL而且URL还是可以点击进去的:还有另外一个较常用到的地方就是聊天系统中识别对话的URL,废话不多说,入正题请看下面的代 ...

  4. 【c++】输出文件的每个单词、行

    假设文件内容为 1. hello1 hello2 hello3 hello4 2. dsfjdosi 3. skfskj ksdfls 输出每个单词 代码 #include <iostream& ...

  5. cesium运行环境搭建

    cesiumjs是什么 一个世界级3D地球仪和地图的开源JavaScript库. 1.安装node.js 环境 1)下载node.js 官网:https://nodejs.org/en/ 下载完成后双 ...

  6. 实现 如 goole closure 类似功能模块加载函数

    看过goole  closure 的同学都知道  其中定义一个类名函数时候只要  inlude("")   想加载某个模块只要require("")就可以利用: ...

  7. js 验证字符串是否全为中文

    js 验证字符串是否全为中文: function isChinese(str) { var reg = /^[\u4E00-\u9FA5]+$/; if(reg.test(str)){ return ...

  8. ODBC, OLEDB, ADO, ADO.NET

    在SSIS中,选择Connction Manager时,有很多的类型.其中会发现如下4个连接类型ODBC, OLEDB, ADO, ADO.NET.这4个东东到底是什么,他们有什么关联,什么区别,如何 ...

  9. 点击select下拉框,触发事件

    <div class="controls moneycheck floatleft"> <select class="span12 chosen_cat ...

  10. 基于bootstrap的图片轮播功能

    插入js及css支持: <link rel="stylesheet" href="css/bootstrap.min.css"/> <scri ...