遠端執行命令,補充subprocess模組,粘包現象及解決辦法

ckxllf發表於2019-12-12

  遠端執行命令,補充subprocess模組,粘包現象及解決辦法

  1.subprocess模組

  shell引數:

  如果把shell設定成True,指定的命令會在shell裡解釋執行。

  subprocess.PIPE

  一個可以被用於Popen的stdin 、stdout 和stderr 3個引數的特輸值,表示需要建立一個新的管道。

  例:

  #author: wylkjj

  #date:2019/4/18

  import subprocess

  # b=subprocess.Popen('dir',shell=True)

  # print(b)

  #stdout=subprocess.PIPE把子程式封裝到a裡面去了

  a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)

  # print(a)#多程式,子程式,父程式同時進行,誰快誰先列印

  print(str(a.stdout.read(),'gbk'))#把執行結果從子程式裡面取出來

  2.遠端執行命令

  #author: wylkjj

  #date:2019/4/18

  #服務端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.bind(address)

  sk.listen(2)

  print('waiting')

  while 1:

  conn,addr=sk.accept()

  print(addr)

  while 1:

  data=conn.recv(4024)

  print('......'+str(data, 'utf8'))

  if not data:break

  obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)

  cmd_result = obj.stdout.read()

  # 獲取傳送資料的大小 為int型別,int型別無法與bytes型別相互轉換,所以int要先轉換成str然後再轉換為bytes型別

  result_len=bytes(str(len(cmd_result)),'utf8')

  conn.sendall(result_len)

  conn.send(cmd_result)

  sk.close()

  #author: wylkjj

  #date:2019/4/18

  #客戶端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.connect(address)

  while True:

  inp = input('>>>')

  if inp=='exit':

  break

  sk.send(bytes(inp,'utf8'))

  result_len=int(str(sk.recv(1024),'utf8'))

  print(result_len)

  # 接收資料,是bytes型別,資料量超過8k就不會接收,所以可以設定多次接收

  data = bytes()

  while len(data) != result_len: #判斷data的長度是否與server端傳來的長度相符

  recv = sk.recv(1024)

  data += recv

  print(str(data,'gbk'))

  sk.close()

  3.粘包現象及解決辦法

  #author: wylkjj

  #date:2019/4/18

  #服務端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.bind(address)

  sk.listen(2)

  print('waiting')

  while 1:

  conn,addr=sk.accept()

  print(addr)

  while 1:

  data=conn.recv(4024)

  print('......'+str(data, 'utf8'))

  if not data:break 鄭州人流價格

  obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)

  cmd_result = obj.stdout.read()

  # 獲取傳送資料的大小 為int型別,int型別無法與bytes型別相互轉換,所以int要先轉換成str然後再轉換為bytes型別

  result_len=bytes(str(len(cmd_result)),'utf8')

  conn.sendall(result_len)

  conn.recv(1024) #因為兩個sand連一起傳送會出現粘包現象,所以recv一下(利用recv的阻塞原理)

  conn.send(cmd_result)

  sk.close()

  #author: wylkjj

  #date:2019/4/18

  #客戶端

  import subprocess

  import socket

  sk=socket.socket()

  address=('127.0.0.1',8000)

  sk.connect(address)

  while True:

  inp = input('>>>')

  if inp=='exit':

  break

  sk.send(bytes(inp,'utf8'))

  result_len=int(str(sk.recv(1024),'utf8'))

  sk.sendall("ok")

  print(result_len)

  # 接收資料,是bytes型別,資料量超過8k就不會接收,所以可以設定多次接收

  data = bytes()

  while len(data) != result_len: #判斷data的長度是否與server端傳來的長度相符

  recv = sk.recv(1024)

  data += recv

  print(str(data,'gbk'))

  sk.close()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2668213/,如需轉載,請註明出處,否則將追究法律責任。

相關文章