socket版远程执行命令client端
import socket
sk = socket.socket() # 初始化sk对象
address = ('127.0.0.1', 8088) # 服务器端地址
sk.connect(address) # 连接服务器端
while True: # 循环,连续发送信息
inp = input(">>>>>") # 输入要执行的命令
sk.sendall(bytes(inp, encoding='utf8')) # 发送命令,sendall只能发送bytes类型
if inp == 'exit': # 输入exit,退出连接
break
result = bytes() # result初始值为空的bytes类型
len_result = int(str(sk.recv(1024), encoding='utf8')) # 接收返回结果长度
sk.sendall(bytes('ok', encoding='utf8')) # 确认接收,向服务端发送确认消息,防止粘包,一发一收
while len(result) != len_result: # 循环接收命令执行结果,单次接收最大1024字节,循环条件:已接收的长度 != 返回结果长度,长度一致表明已经全部接收,不再接收
data = sk.recv(1024) # 接收数据,最大1024
result += data # result = result+data
result = str(result, encoding='gbk') # 将结果转化为字符串
print(result) # 打印结果
sk.close() # 关闭连接socket版远程执行命令server端
import socket
import subprocess
sk = socket.socket() # 初始化sk对象
address = ('127.0.0.1', 8088) # 设置ip端口
sk.bind(address) # 绑定ip端口
sk.listen(5) # 最大连接数
while True: # 循环监听,确保一个连接断开后服务端继续运行
conn, addr = sk.accept() # 初始化连接,addr获取远端地址,进入等待
print('waiting......')
while True: # 子循环,用于可客户端信息交互
try: # 捕获异常,客户端中断后,退出子循环,等待下次连接
data = str(conn.recv(1024), encoding='utf8') # 正常获取data,继续执行,报错则走except捕获异常退出
except Exception as e:
print(e) # 打印异常
break # 退出子循环
if data == 'exit': # 如果客户端输入为exit,跳出循环
break
print("执行命令:{}".format(data)) # 打印客户端要在服务器端执行的命令
cmd_recv = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 执行命令,将标准输出,标准错误输出,打印到主线程
cmd_result = cmd_recv.stdout.read() # 获取标准输出,类型是bytes
cmd_result_err = cmd_recv.stderr.read() # 获取标准错误输出,类型是bytes
if str(cmd_result, encoding='gbk') != '': # 判断标准输入是否存在
result = cmd_result # 存在,result等于标准输出,bytes类型
else:
result = cmd_result_err # 不存在,result等于标准错误输出,bytes类型
len_result = bytes(str(len(result)), encoding='utf8') # 获取result长度,转化为bytes类型,sendall只能发送bytes类型
conn.sendall(len_result) # 发送长度
status = str(conn.recv(1024), encoding='utf8') # 接收客户端返回,两个连续sendall之间增加recv进行阻塞,防止粘包
conn.sendall(result) # 发送命令执行结果,result是标准输出或标准错误输出,本身就是bytes类型
conn.close() # 关闭连接原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。