ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python简单实现远程执行命令

2022-01-16 17:04:57  阅读:257  来源: 互联网

标签:执行命令 socket ss python cmd header recv 远程 size


简单版 ssh

# Server
import json
import socket

# 建立socket,监听
import struct
import subprocess

ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ss.bind(('127.0.0.1', 8080))
ss.listen(5)
print("server listen.....")

# 接受信息
while True:
conn, client_addr = ss.accept()
print(client_addr)

while True: #通信开始
try:
cmd = conn.recv(1024)
if not cmd:
break

# 执行命令
obj = subprocess.Popen(cmd.decode('utf-8'), shell=True,
stdout=subprocess.PIPE,
stderr= subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
# 执行命令,并发送执行结果
# 第一步:制作固定长度的报头
header_dic = {
'filename': 'a.txt',
'md5': '654444444654545535354',
'total_size': len(stderr) + len(stdout)
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')

# 第二步:先发送报头长度
conn.send(struct.pack('i', len(header_bytes)))

# 第三步:发送报头
conn.send(header_bytes)

# 第四步:发送真实的数据
conn.send(stdout)
conn.send(stderr)
except ConnectionResetError:
break
conn.close()
ss.close()


# client
import json
import socket

# 创建socket
import struct

ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ss.connect(('127.0.0.1', 8080))

# 发送信息
while True:
cmd = input('input your cmd: ').strip()
if not cmd:
continue
ss.send(cmd.encode('utf-8'))
# 接受信息
# 第一步:接受报头长度
obj = ss.recv(4)
header_size = struct.unpack('i', obj)[0]

# 第二步:再接受报头
header_bytes = ss.recv(header_size)
# 第三步:从报头中解析出对真实数据的描述信息
header_json = header_bytes.decode('utf-8')
header_dic = json.loads(header_json)
print(header_dic)
total_size = header_dic['total_size']

# 第四步:接受真实的数据
recv_size = 0
recv_data = b''
while recv_size < total_size:
res = ss.recv(1024)
recv_data += res
recv_size += len(res)

print(recv_data.decode('gbk'))

ss.close()

标签:执行命令,socket,ss,python,cmd,header,recv,远程,size
来源: https://www.cnblogs.com/xinbigworld/p/15810554.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有