#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)
服务器端运行结果:
客户端运行结果: