在python中使用os模組或者subprocess模組執行遠端命令,並把執行結果傳送給客戶端的時候,會發生黏包現象,這是因為服務端傳送的資料量大,客戶端一次收的資料量小導致快取中的內容沒有讀取完,下次接著執行命令時,還會接著從快取中讀取內容,這時就會發生黏包現象。
1. 使用os模組遠端執行命令
服務端**
1 importsocket2 importos
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 importsocket2 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 importsocket2 importsubprocess
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 iferr:
27 ret_msg =err
28 else:
29 ret_msg =ret.stdout.read()
30 if notret_msg:
31 ret_msg = "命令執行成功".encode('gbk')
32 print('---------命令執行完成')
33 conn.send(ret_msg)
34
35 conn.close()
客戶端**
1 importsocket2 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()
python的os模組使用
檢視os的名字 import os print os.name nt,nt 表示windows系統,posix 表示linux系統 檢視os環境變數 import os print os.environ print os.environ.get pat default 檢視變數 pat 若不存在,則...
python模組 OS模組
bin env python coding utf 8 import os print os.name 輸出主機平台 print os.getcwd 輸出當前目錄 print os.listdir os.getcwd 輸出當前目錄的檔案 橫向 for i in os.listdir os.getcw...
python 模組 OS模組
print os.getcwd 輸出 e python workspace 原來 print os.getcwd 輸出 e python workspace 返回上級目錄 os.chdir os.getcwd 輸出 e python 更改 os.chdir r e print os.getcwd 輸...