python-socket实现简单的ssh客户端

  客户端代码,监听端口号为 localhost 9999

#!/usr/local/bin/python3
# -*- coding:utf-8 -*-

import socket
client = socket.socket()

client.connect(('localhost', 9999))

while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0:
        continue
    client.send(cmd.encode("utf-8"))
    cmd_res_size = client.recv(1024)    # 接收命令结果的长度
    print("命令结果大小:", cmd_res_size.decode())

    # 防止粘包-装逼方法
    client.send("接收成功".encode("utf-8"))

    # print(cmd_res)

    received_size = 0

    while received_size < int(cmd_res_size.decode()):

        data = client.recv(1024)
        received_size += len(data)
        print(data.decode())
        print("-----%s-----" % len(data))
    else:
        print("received done...", cmd_res_size.decode())



client.close()

  服务器端代码

#!/usr/local/bin/python3
# -*- coding:utf-8 -*-

import socket, os, time

server = socket.socket()
server.bind(('localhost', 9999))

server.listen()

while True:
    conn, addr = server.accept()
    print("new conn:", addr)
    while True:
        data = conn.recv(1024)
        if not data:
            print("客户端断开连接")
            break
        print("执行指令:", data)
        cmd_res = os.popen(data.decode()).read()
        conn.send(str(len(cmd_res)).encode("utf-8"))    # 先发大小给客户端

        # 防止粘包-low的方法
        # time.sleep(0.5)     # 强制缓冲区超时,防止粘包

        # 防止粘包-装逼方法     # 在两次send中间强制进行一次收发,这样就能有效防止粘包
        ack = conn.recv(1024)
        print(">>>>>:", ack.decode())

        tmp = conn.send(cmd_res.encode("utf-8"))
        print(">>>>>: 发送成功")

server.close()

  

猜你喜欢

转载自www.cnblogs.com/octopuszy/p/9222699.html