模擬ssh遠程執行命令

1、服務端

from socket import *
import subprocess

server = socket(AF_INET, SOCK_STREAM)

server.bind(('127.0.0.1', 8000))
server.listen(5)

print('start...')
while True:
    conn, client_addr = server.accept()

    while True:
        print('from client:', client_addr)

        cmd = conn.recv(1024)
        if len(cmd) == 0: break
        print('cmd:', cmd)

        obj = subprocess.Popen(cmd.decode('utf8'),  # 輸入的cmd命令
                               shell=True,  # 經過shell運行
                               stderr=subprocess.PIPE,  # 把錯誤輸出放入管道,以便打印
                               stdout=subprocess.PIPE)  # 把正確輸出放入管道,以便打印

        stdout = obj.stdout.read()  # 打印正確輸出
        stderr = obj.stderr.read()  # 打印錯誤輸出

        conn.send(stdout)
        conn.send(stderr)

    conn.close()

server.close()

2、客戶端

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(('127.0.0.1', 8000))

while True:
    data = input('please enter your data')
    client.send(data.encode('utf8'))
    data = client.recv(1024)

    print('from server:', data)

client.close()

輸入dir命令,因爲服務端發送字節少於1024字節,客戶端能夠接受。shell

輸入tasklist命令,因爲服務端發送字節多於1024字節,客戶端只接受部分數據,而且當你再次輸入dir命令的時候,客戶端會接收dir命令的結果,可是會打印上一次的剩餘未發送完的數據,這就是粘包問題。socket

相關文章
相關標籤/搜索