Skip to content

Latest commit

 

History

History
103 lines (73 loc) · 2.47 KB

7.md

File metadata and controls

103 lines (73 loc) · 2.47 KB

#7.agent: 实现一个被控程序,连接对应的端口便可以对被控端输送命令。 这是一个可以重复调用的服务,不能把bash 的io 直接绑到tcp 上。命令运行完 后命令的输出应该能返回到控制机的STDOUT。(考察tcp,多线程等)

##Answer

###Python2.7 代码:

服务器端

#!/usr/bin/env python
# coding:utf-8
"""
    使用 socket 模拟 ssh 通道
"""

__author__ = 'tianfeiyu'

import SocketServer
import commands


class CommandSocketServer(SocketServer.BaseRequestHandler):
    """
        使用 socketserver 实现多线程
    """
    def handle(self):
        print "Got a new connect from:",self.client_address
        while True:
            cmd = self.request.recv(1024)
            if not cmd:
                print "lost connect:",self.client_address
                break
            print "from %s received: %s" %(self.client_address, cmd)
            cmd_result = commands.getstatusoutput(cmd)
            self.request.send(str(len(cmd_result[1])))
            self.request.sendall(cmd_result[1])

if __name__ == '__main__':
    host = '222.24.51.147'
    port = 50000
    s = SocketServer.ThreadingTCPServer((host,port), CommandSocketServer) 
    s.serve_forever()

客户端

#!/usr/bin/env python
# coding:utf-8

__author__ = 'tianfeiyu'

import socket


def recv_all(obj,msg_size):
    """
        循环接收数据
    """ 

    raw_result = ''
    while msg_size != 0:
        if msg_size <= 4096:
            data = obj.recv(4096)
            msg_size = 0
        else:
            data = obj.recv(4096)
            msg_size -= 4096

        raw_result += data
    return raw_result

def connect_server(host,port):
    c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    c.connect((host,port))
    while True:
        user_input = raw_input('input cmd > ').strip()
        if len(user_input) ==  0:
            continue
        c.sendall(user_input)
        return_size = int(c.recv(1024))
        result = recv_all(c,return_size)
        print result

if __name__ == '__main__':
    host = '222.24.51.147'
    port = 50000
    connect_server(host,port)

服务器端运行结果:

服务器端运行结果

客户端运行结果:

客户端运行结果