Python學習---遠程執行命令

來源:互聯網
上載者:User

標籤:ESS   服務   import   put   地址   coding   family   lse   檔案路徑   

原則:發送一個接受一個

原理:發送執行命令的大小給用戶端,用戶端根據接受的大小判斷是否全部接收了伺服器sendall()發送的全部

利用send發送的全部資料都是bytes類型的,需要進行字元編碼的轉換,因為中文環境,所以需要轉換GBK查看

用戶端:

# 用戶端import socket# family=AF_INET,   代表使用IPV4的IP協議# type=SOCK_STREAM  代表使用TCP協議進行串連client = socket.socket()ip_addr = (‘127.0.0.1‘, 9999)try:    client.connect(ip_addr)    exit_flag = True    while exit_flag:        # 發送一定要有接收        inp = input(‘>>>:‘)        if inp != ‘bye‘:            client.send(bytes(inp, ‘utf-8‘))            exit_flag = True        else:            client.send(bytes(inp, ‘utf-8‘))            exit_flag = False        result_len = int(str(client.recv(1024), encoding=‘utf-8‘)) # 接受伺服器端發送的資料大小        print(‘用戶端接收的大小為:‘, result_len)        data_size = bytes()        while len(data_size) != result_len:            info = client.recv(1024)    # 最大接收1024K資料,# 傳送/接收的資料一定是byte類型            data_size += info        print(‘用戶端:‘, str(data_size, ‘gbk‘)) # Win7系統就是GBK編碼返回的資料except Exception as e:    print(‘用戶端關閉串連‘, e)finally:    client.close()

服務端:

# 服務端import socketimport subprocess# family=AF_INET,   代表使用IPV4的IP協議# type=SOCK_STREAM  代表使用TCP協議進行串連server = socket.socket()  # 建立socketip_addr = (‘127.0.0.1‘, 9999)  # 1024之前的連接埠,預設是OS使用server.bind(ip_addr)           # 要求必須是一個元組server.listen(3)               # 開始監聽傳入串連。在拒絕串連之前,可以掛起的最大串連數量。while True:    conn, addr = server.accept() # 接受串連並返回(conn,address)                                 # 其中conn是新的通訊端對象[用戶端],可以用來接收和發送資料。                                 # address是串連用戶端的地址。    exit_flag = True    while exit_flag:        print(‘當前連線物件‘, addr)        # 發送一定要有接收        data = conn.recv(1024)        print(‘伺服器:‘, str(data, ‘utf-8‘))        obj = subprocess.Popen(str(data, ‘utf-8‘), shell=True, stdout=subprocess.PIPE)        cmd_result = obj.stdout.read()  # 編碼用GBK,預設在當前檔案所在的檔案路徑        conn.sendall(bytes(str(len(cmd_result)), encoding=‘utf-8‘))   # 發送資料大小,int不能直接轉換為bytes        print(‘伺服器發送的大小為:‘, len(cmd_result))  # 某種程度上解決了粘包現象        conn.sendall(cmd_result)        # 發送全部的資料server.close()

 

注意:  粘包現象: 在伺服器端連續send()的時候,2個send直接會等待很短的時間,所以導致傳遞過去的len會報錯,因為不能轉換為int型,可以利用Time.sleep解決,也可以遵循一收一發的原則,發送一個以後在發送一次解決。

Python學習---遠程執行命令

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.