033遠程執行命令,033執行命令
在伺服器執行命令
之前好像缺了執行命令的模組,現在補上
import subprocessobj = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)#拿到一個對象,前面是命令,shell設定可以執行指令碼,stdout設定一個進程管道,這裡實際上是有兩個進程,一個是主進程,一個是shell進程x = obj.stdout.read() # 這裡拿到執行資訊print(str(x,'gbk')) # str(x,'utf8')忘記系統是gbk編碼了
###遠程執行命令例子:
#指令執行結果短的,不會出現問題
1 import socket 2 import subprocess 3 def get_server_socket(): 4 sk = socket.socket() 5 server_address = ('127.0.0.1',8888) 6 sk.bind(server_address) 7 sk.listen(5) 8 return sk 9 10 def get_conn(sk):11 print('waitconnect...')12 conn,addr = sk.accept()13 return conn14 15 if __name__ == '__main__':16 sk = get_server_socket()17 conn = get_conn(sk)18 while True:19 try:20 data = conn.recv(1024)##Linux這裡不會報錯,如果強行關閉了conn,data就會變成空,也就是說Linux的直接不try就行了。21 except Exception as e:22 conn = get_conn(sk)23 print(str(data,'utf8'))24 if not data:25 conn = get_conn(sk)26 continue27 sp = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)#注意命令要是字串類型28 result = sp.stdout.read()#str(sp.stdout.read(),'gbk')29 conn.send(result)30 print(str(result,'gbk'))31 print('waiting...')32 conn.close()cmd_server.py
1 import socket 2 3 def connect_server(): 4 sk = socket.socket() 5 server_address = ('127.0.0.1',8888) 6 sk.connect(server_address) 7 return sk 8 9 if __name__ == '__main__':10 sk = connect_server()11 while True:12 inp = input('>>>')13 if inp == 'exit':14 break15 sk.send(bytes(inp,'utf8'))16 print('waiting...')17 data = sk.recv(1024)18 print(str(data,'gbk'))19 sk.close()cmd_client.py
#指令執行結果較長,無法一次傳遞,改進。傳送檔案的思想。
1 import socket 2 import subprocess 3 def get_server_socket(): 4 sk = socket.socket() 5 server_address = ('127.0.0.1',8888) 6 sk.bind(server_address) 7 sk.listen(5) 8 return sk 9 def get_conn(sk):10 print('waitconnect...')11 conn, addr = sk.accept()12 return conn13 14 if __name__ == '__main__':15 sk = get_server_socket()16 conn = get_conn(sk)17 while True:18 try:19 data = conn.recv(1024)##Linux這裡不會報錯,如果強行關閉了conn,data就會變成空,也就是說Linux的直接不try就行了。20 except Exception as e:21 conn = get_conn(sk)22 print(str(data,'utf8'))23 if not data:24 conn = get_conn(sk)25 continue26 sp = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)#注意命令要是字串類型27 result = sp.stdout.read()#讀取內容28 conn.sendall(bytes(str(len(result)),'utf8'))#發送長度29 conn.sendall(result)#發送內容30 print(str(result,'gbk'))31 print('waiting...')32 conn.close()cmd_server.py
1 import socket 2 def connect_server(): 3 sk = socket.socket() 4 server_address = ('127.0.0.1',8888) 5 sk.connect(server_address) 6 return sk 7 8 if __name__ == '__main__': 9 sk = connect_server()10 while True:11 inp = input('>>>')12 if inp == '__exit':13 break14 sk.send(bytes(inp,'utf8'))15 print('waiting...')16 17 result_length = int(str(sk.recv(1024),'utf8'))#記錄長度,然後下面接收到相應長度的那內容停止18 data = bytes()19 while len(data) != result_length:20 r = sk.recv(1024)21 data += r22 print(str(data,'gbk'))23 sk.close()cmd_client.py
####另外兩次連續接收會出現粘包現象
做個隔斷,就是接收方隨便發送一個資料,發送方接受後才繼續發送,這樣子就解決了。