博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day30 模拟ssh远程执行命令
阅读量:5972 次
发布时间:2019-06-19

本文共 1755 字,大约阅读时间需要 5 分钟。

服务端:

from socket import * import subprocess import struct server=socket(AF_INET,SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) while True:     conn,client_addr=server.accept()     print('新的客户端',client_addr)     while True:         try:             cmd=conn.recv(1024) #cmd=b'dir'             if len(cmd) == 0:break             # 运行系统命令             obj=subprocess.Popen(cmd.decode('utf-8'),                              shell=True,                              stderr=subprocess.PIPE,                              stdout=subprocess.PIPE                              )             stdout=obj.stdout.read()             stderr=obj.stderr.read()             #1、先制作报头(固定长度)             total_size=len(stdout) + len(stderr)             header=struct.pack('i',total_size)             #2、先发送固定长度的报头             conn.send(header)             #3、再发送真实的数据             conn.send(stdout)             conn.send(stderr)         except ConnectionResetError:             break     conn.close() 客户端:
from socket import * import struct client=socket(AF_INET,SOCK_STREAM) client.connect(('127.0.0.1',8080)) while True:     cmd=input('>>: ').strip()     if len(cmd) == 0:continue     client.send(cmd.encode('utf-8'))     #1、先收固定长度的报头     header=client.recv(4)     #2、从报头中解析出对数据的描述信息     total_size=struct.unpack('i',header)[0]     #3、再收真实的数据     recv_size=0     res=b''     while recv_size < total_size :         data=client.recv(1024)         res+=data         recv_size+=len(data)     print(res.decode('gbk'))

注意注意注意:

res=subprocess.Popen(cmd.decode('utf-8'),

shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)

的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码

且只能从管道里读一次结果

 

转载于:https://www.cnblogs.com/fxc-520520/p/9285657.html

你可能感兴趣的文章
redis 安装及php扩展编译安装
查看>>
MPAndroidChart---饼状图PieChart
查看>>
PHP中基于b2core框架内部的网页上Html输出生成Word的处理
查看>>
采用Servlet Listener方式运行Liquibase
查看>>
TCP-IP 学习(三) TCP
查看>>
递归和非递归
查看>>
创建本地yum仓库
查看>>
对比两个无序整形数组相似度问题算法
查看>>
浅谈web应用的负载均衡、集群、高可用(HA)解决方案
查看>>
eclipse cdt 无法正确显示代码提示 No Default Proposals
查看>>
批量有效地修改package名
查看>>
Vxlan基础理解
查看>>
MongoDB 使用mapreduce完成数据迭代
查看>>
创建自定义的 iOS Framewok
查看>>
jquery.qrcode 生成二维码
查看>>
重装系统后,让mysql再次运行
查看>>
Drupal7 db_query SQL查询运用
查看>>
以太坊问题
查看>>
关于ListView head 动态设置高度
查看>>
poj 1191 棋盘分割
查看>>