原则:发送一个接受一个

原理:发送执行命令的大小给客户端,客户端根据接受的大小判断是否全部接收了服务器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跨域解决方法

    from django.utils.deprecation import MiddlewareMixin class Mymiddle(MiddlewareMixin): def process_re ...

  2. CentOS6.5安装testlink1.9.14

    前提条件:准备一台CentOS6.5虚拟机,配置好IP,关闭iptables和selinux. 这里提供上我的云盘软件,可以去这里下载:http://pan.baidu.com/s/1qXymele ...

  3. Go语言包管理工具Glide

      Go语言包管理工具用于管理Go项目的库和库的依赖引用. 包管理工具普遍会在Go项目根目录生成Vendor文件夹并自动下载该Go项目需要的库. Go语言有很多开源的包管理工具,这里主要介绍Glide ...

  4. Anaconda环境变量配置问题解决

    (右键)我的电脑==>属性==>高级系统设置==>环境变量==>Path 按照下图添加: 总共4个,如果出现“此环境变量太大...”,删除或者缩短其他环境变量地址. 然后重新打 ...

  5. bug缺陷级别定义

    缺陷定义: 出现以下缺陷测试定义为致命 bug l  系统无响应处于死机状态. l  点击某个菜单后出现“The page cannot be displayed”或者返回异常错误. l  进行某 ...

  6. Netty SSL性能调优

    TLS算法组合 在TLS中,5类算法组合在一起,称为一个CipherSuite: 认证算法 加密算法 消息认证码算法 简称MAC 密钥交换算法 密钥衍生算法 比较常见的算法组合是 TLS_ECDHE_ ...

  7. Java复习第一天

    Day01 1.独立编写Hello World程序. public class Test{ public static void main(String[] args){ System.out.pri ...

  8. EasyPusher推流类库的.NET调用说明

    EasyPusher推流类库的.NET调用说明 以下内容基于在使用EasyPusher过程中遇到的问题,以及相应的注意事项.本文主要是基于对C++类库的二次封装(便于调试发现问题)以供C#调用以及对一 ...

  9. OOP 第二章作业总结

    实现策略 这里结合一下我画的第三次作业的时序图(可能有画的不好的地方)来叙述一下我的实现逻辑.最开始主线程负责创建必要的线程(输入.调度线程)与请求队列类实例:输入线程负责与人进行交互,将获取到的请求 ...

  10. 八 SocketChannel

    SocketChannel是一个连接到Tcp网络套接字的通道.可以通过以下两种方式创建SocketChannel: 1.打开一个SocketChannel并连接到互联网上的某台服务器. 2.一个新连接 ...