Python_利用socket进行指令执行与文件传输

  1. socket执行指令
# Author : Xuefeng
# 服务器端

import socket
import os

server = socket.socket()
server.bind(("Localhost", 6969))        # 绑定要监听的端口
server.listen()                         # 监听

while True:
    print("开始工作")
    conn, addr = server.accept()                         # 等电话打进来
    # conn就是客户端连过来而在服务器端为其生成的一个连接实例
    print("建立连接:", addr)

    while True:
        print("等待指令")
        data = conn.recv(1024)
        print("recv:", data)
        # conn.send(data.upper())

        # ssh
        res = os.popen(data.decode()).read()    # 执行指令如果是字符串返回的也是字符串
        # print(len(res.encode()))
        if not len(res):
            print("指令错误")
            res = "没有这个指令"
            conn.send(res.encode())
            continue

        conn.send(str(len(res.encode())).encode())  # 告诉客户端指令执行结果的长度
        client_ack = conn.recv(1024)                # 解决黏包问题
        conn.send(res.encode())                     # 发送指令执行结果

server.close()

# Author : Xuefeng
# 客户端
import socket

client = socket.socket()        # 声明socket类型, 同时生成socket连接对象
client.connect(("Localhost", 6969))

while True:
    msg = input(">>:").strip()              # 输入指令
    client.send(msg.encode(encoding = "utf-8")) # 发送指令给服务器端
    info = client.recv(1024)
    if not info.decode():
        print("此条会话结束")
        continue
    elif info.decode() == "没有这个指令":
        print("指令错误:", msg)
        continue
    else:
        print("命令结果大小:", info.decode())
        client.send("准备接受执行结果".encode("utf-8"))
        recieved_size = 0
        recieved_data = b''
        while recieved_size < int(info):
            data = client.recv(1024)
            recieved_size += len(data)
            # print("recv:", data.decode(encoding="utf-8"))
            print(recieved_size)
            recieved_data += data
        else:
            print("cmd res recieved done...", recieved_size)
            print(recieved_data.decode())
client.close()
  1. socket文件传输
# Author : Xuefeng
# 服务器端

import socket
import os
import time
import hashlib

server = socket.socket()
server.bind(("Localhost", 6969))        # 绑定要监听的端口
server.listen()                         # 监听

while True:
    print("开始工作")
    conn, addr = server.accept()                         # 等电话打进来
    # conn就是客户端连过来而在服务器端为其生成的一个连接实例
    print("建立连接:", addr)

    while True:
        print("等待指令")
        data = conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        cmd, filename = data.decode().split()
        print(filename)
        if os.path.isfile(filename):
            f = open(filename, "rb")
            m = hashlib.md5()
            file_size = os.stat(filename).st_size
            conn.send(str(file_size).encode())  # send the size of file
            conn.recv(1024)                 # wait for ack
            for line in f:
                m.update(line)
                conn.send(line)
            print("file_md5", m.hexdigest())
            f.close()
            conn.send(m.hexdigest().encode())

        print("send done")

server.close()

# Author : Xuefeng
# 客户端
import socket
import os
import hashlib

client = socket.socket()        # 声明socket类型, 同时生成socket连接对象
client.connect(("Localhost", 6969))

while True:
    msg = input(">>:").strip()              # 输入指令
    if len(msg) == 0:continue
    if msg.startswith("get"):
        client.send(msg.encode())
        server_response = client.recv(1024)
        print("Server response:", server_response)
        client.send(b"Ready to recv file")
        file_total_size = int(server_response.decode())
        recieved_size = 0
        file_name = msg.split()[1]
        f = open(file_name+".new", "wb")
        m = hashlib.md5()
        while recieved_size < file_total_size:
            if (file_total_size - recieved_size) > 1024:
                size = 1024
            else:
                size = file_total_size - recieved_size
                # print("last size:", size)

            data = client.recv(1024)
            # print("len:", len(data))
            recieved_size += len(data)
            m.update(data)
            f.write(data)
            # print(file_total_size, recieved_size)
        else:
            new_file_md5 = m.hexdigest()
            print("File recv done")
            f.close()
        server_file_md5 = client.recv(1024)
        print("server file md5:", server_file_md5.decode())
        print("new file md5: ", new_file_md5)
client.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值