Python 3.6 socket 简单远程命令CS

来源:互联网 发布:修改 nginx的 变量 编辑:程序博客网 时间:2024/06/07 09:59

如果大家对python的socket不是很熟,或者网络通信过程不了解的话请先百度一下,我这里直接上示例了

Server 端

# -----------------------# __Author : tyran# __Date : 17-11-15# -----------------------# Serverimport socketimport subprocess# 创建套接字listen_fd = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)# 绑定ip和portlisten_address = ('127.0.0.1', 8888)listen_fd.bind(listen_address)# 设置套接字是否阻塞,一般都是阻塞的,如果不写也可以,默认就是阻塞listen_fd.setblocking(True)# 启动监听,参数是排队数量,不包括已经连上的一个,我在linux下测试失败了。。。。一直都是5listen_fd.listen(2)while True:    # 开始监听,accept()如果没有客户端连上来,会阻塞    # 返回值是有两个值,第一个是通信套接字,第二个是客户端信息    connected_fd, client_address = listen_fd.accept()    print(connected_fd)    print(client_address)    print('=============================================')    """    这里我会做一个远程命令调用,我的平台是linux    """    while True:        # 然后接收客户端传来的命令        command_data = connected_fd.recv(1024)        # 如果客户端断开,会发送过来一个空字符串’‘        if not command_data:            # 关闭套接字            connected_fd.close()            break        # subprocess可以重启一个新的进程执行命令        command_obj = subprocess.Popen(str(command_data, encoding='utf-8'), shell=True, stdout=subprocess.PIPE)        # stdout_data就是命令执行以后的输出        stdout_data = command_obj.stdout.read()        # 先把一共发送多少个字节数据发过去        connected_fd.send(bytes(str(len(stdout_data)), encoding='utf-8'))        # 这里需要防止粘连        connected_fd.recv(1024)        # 发送命令行输出的数据        connected_fd.sendall(stdout_data)


Client 端

# -----------------------# __Author : tyran# __Date : 17-11-15# -----------------------# Clientimport socketconnect_fd = socket.socket()connect_fd.connect(('127.0.0.1', 8888))while True:    cmd = input('>>>>')    if cmd == 'exit':        connect_fd.close()        break    # 发送命令    connect_fd.send(bytes(cmd, encoding='utf-8'))    # 获取字节数    data_len = int(str(connect_fd.recv(1024),encoding='utf-8'))    # 防止粘连    connect_fd.send(bytes('ok', encoding='utf-8'))    # 显示数据    data = ''    while len(data) < data_len:        data += str(str(connect_fd.recv(1024),encoding='utf-8'))    print(data)