Python中使用os模块执行远程命令

在Python中使用os模块或者subprocess模块执行远程命令,并把执行结果发送给客户端的时候,会发生黏包现象,这是因为服务端发送的数据量大,客户端一次收的数据量小导致缓存中的内容没有读取完,下次接着执行命令时,还会接着从缓存中读取内容,这时就会发生黏包现象。

1. 使用os模块远程执行命令

服务端代码

 1 import socket
 2 import os
 3 
 4 sh_server = socket.socket()  #创建一个socket对象
 5 sh_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  #重置IP和端口
 6 sh_server.bind(('127.0.0.1',8001))  #绑定服务器IP和端口
 7 sh_server.listen(5)  #设置最大监听数
 8 
 9 while True: #链接循环
10     conn,addr = sh_server.accept()  #阻塞,等待客户端过来链接
11 
12     while True: #通信循环
13     # 接收客户端发送过来的消息
14     cmd = conn.recv(buffer_size).decode('utf-8')
15     #使用os模块中的popen远程执行命令
16     data = os.popen(cmd)
17     res_msg=data.read()
18     #执行结果发送给客户端
19     conn.send(res_msg.encode('gbk'))
20     print(res_msg)
21     print(len(res_msg))
22 conn.close()
23     

客户端代码

 1 import socket
 2 
 3 sh_client = socket.socket() #创建socket对象
 4 sh_client.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
 5 
 6 sh_client.connect(('127.0.0.1',8001))  #链接服务端
 7 
 8 while True: #通信循环
 9     cmd = input("请输入要执行的命令:")
10     if cmd == '': continue
11     if cmd =='exit' or cmd =='quit':break
12     sh_client.send(cmd.encode('utf-8'))
13     res_info = sh_client.recv(1024).decode('gbk')
14     print('命令执行结果是:',res_info)
15 sh_client.close()

 

2. 使用subprocess模块执行远程命令

服务端代码

 1 import socket
 2 import subprocess
 3 
 4 sh_server = socket.socket()
 5 sh_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  #重置IP和端口
 6 sh_server.bind(('127.0.0.1',8001))
 7 sh_server.listen(5)
 8 
 9 while True: #链接循环
10     conn,addr = sh_server.accept()  #阻塞,等待客户端过来链接
11     print('客户端信息',conn,addr)
12 
13     while True: #通信循环
14         # 接收客户端发送过来的消息
15         print('----------接收命令')
16         cmd = conn.recv(buffer_size).decode('utf-8')
17         print('要执行的命令是:',cmd)
18         if cmd == 'exit' or cmd == 'quit':break
19         #使用subprocess模块执行远程命令
20         ret = subprocess.Popen(cmd,shell=True,
21                                stdout = subprocess.PIPE,
22                                stderr = subprocess.PIPE,
23                                stdin = subprocess.PIPE)
24 
25         err = ret.stderr.read()
26         if err:
27             ret_msg = err
28         else:
29             ret_msg = ret.stdout.read()
30         if not ret_msg:
31             ret_msg = "命令执行成功".encode('gbk')
32         print('---------命令执行完成')
33         conn.send(ret_msg)
34     
35     conn.close()

客户端代码

 1 import socket
 2 
 3 sh_client = socket.socket()
 4 sh_client.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
 5 
 6 sh_client.connect(('127.0.0.1',8001))
 7 
 8 while True: #通信循环
 9     cmd = input("请输入要执行的命令:")
10     if cmd == '': continue
11     if cmd =='exit' or cmd =='quit':break
12     sh_client.send(cmd.encode('utf-8'))
13     res_info = sh_client.recv(1024).decode('gbk')
14     print('命令执行结果是:',res_info)
15 sh_client.close()
posted @ 2020-03-16 11:15  wuchenhu  阅读(605)  评论(0编辑  收藏  举报