具备简单的管理功能,运行后 telnet localhost 9000 端口可以进行管理主要功能就是做包转发,如果有一个桥服务器,可以用来外网访问内网用,还是很管用的
#/bin/env python |
002 | #coding:utf-8 |
003 | |
004 |
import
socket,select,sys,time
|
005 |
import
thread
|
006 | |
007 |
s_list =[]
|
008 | |
009 |
def
loop(cs,addr,s_ip,s_port):
|
010 |
print'%s %d connected.'
% addr
|
011 |
ts=
socket.socket()
|
012 | |
013 |
try:
|
014 |
ts.connect((s_ip,s_port))
|
015 |
except:
|
016 |
cs.close()
|
017 |
print'%s %d closed.'
%addr
|
018 |
sys.exit(0)
|
019 | |
020 |
whileTrue:
|
021 | |
022 |
rl,wl,xl=
select.select([cs.fileno(),ts.fileno()],[],[cs.fileno(),ts.fileno()])
|
023 | |
024 |
iflen(xl) >
0:
|
025 |
cs.close()
|
026 |
ts.close()
|
027 |
print'%s %d closed.'
%addr
|
028 |
sys.exit(0)
|
029 | |
030 |
iflen(rl) >
0:
|
031 |
ifrl[0]==cs.fileno():
|
032 |
rs=
ts
|
033 |
ws=
cs
|
034 |
else:
|
035 |
rs=
cs
|
036 |
ws=
ts
|
037 | |
038 |
try:
|
039 |
buffer=
ws.recv(10000)
|
040 |
iflen(buffer)==0:
|
041 |
raise
|
042 |
rs.send(buffer)
|
043 |
except:
|
044 |
rs.close()
|
045 |
ts.close()
|
046 |
print'%s %d closed.'
%addr
|
047 |
sys.exit(0)
|
048 | |
049 |
def
mainserver(l_port,s_ip,s_port):
|
050 |
globals_list
|
051 |
try:
|
052 |
ss=
socket.socket()
|
053 |
ss.bind(('0.0.0.0',l_port))
|
054 |
ss.listen(10)
|
055 |
s_list.append((l_port,s_ip,s_port))
|
056 |
except:
|
057 |
sys.exit(0)
|
058 | |
059 |
whileTrue:
|
060 |
cs,addr=
ss.accept()
|
061 | |
062 |
thread.start_new_thread(loop,(cs,addr,s_ip,s_port))
|
063 | |
064 |
def
manager(l_port):
|
065 |
globalstart,s_list
|
066 | |
067 |
ss=
socket.socket()
|
068 |
ss.bind(('0.0.0.0',l_port))
|
069 |
ss.listen(10)
|
070 | |
071 |
whileTrue:
|
072 |
cs,addr=
ss.accept()
|
073 |
cs.send("""trans server 1.0\r\ntype 'help' to get help\r\n""")
|
074 |
buffer=
''
|
075 |
whileTrue:
|
076 |
buf=
cs.recv(10000)
|
077 |
iflen(buf)
==
0:
|
078 |
cs.close()
|
079 |
break
|
080 |
ifbuf[-1]not
in('\r','\n'):
|
081 |
buffer+=
buf
|
082 |
continue
|
083 |
buffer+=
buf
|
084 |
cmd=
buffer.strip()
|
085 |
buffer=
''
|
086 |
ifcmd
=='exit':
|
087 |
cs.close()
|
088 |
break
|
089 |
elifcmd
=='stop':
|
090 |
start=
0
|
091 |
cs.close()
|
092 |
sys.exit(0)
|
093 |
elifcmd
=='list':
|
094 |
b=
''
|
095 |
forl
in s_list:
|
096 |
b+='%4d %s:%d\r\n'
%l
|
097 | |
098 |
iflen(b) >
0:
|
099 |
cs.send(b)
|
100 |
elifcmd
in ('help','?'):
|
101 |
cs.send("""-------------------------------------------\r
|
102 | exit\r |
103 |
exit telnet\r
|
104 | start localport serverip:serverport\r |
105 |
start a new server\r
|
106 | list\r |
107 |
list all server\r
|
108 | -------------------------------------------\r |
109 |
""")
|
110 |
else:
|
111 |
cmds=
cmd.split(" ",1)
|
112 |
iflen(cmds) >
1 and
cmds[0]
==
'start':
|
113 |
args=
cmds[1].strip().split(" ",1)
|
114 |
iflen(args) !=2:
|
115 |
cs.send('start localport serverip:serverport\r\n')
|
116 |
continue
|
117 |
arg=
args[1].split(":",1)
|
118 |
iflen(arg) !=2:
|
119 |
cs.send('start localport serverip:serverport\r\n')
|
120 |
continue
|
121 | |
122 |
try:
|
123 |
l_port=
int(args[0])
|
124 |
s_ip=
arg[0]
|
125 |
s_port=
int(arg[1])
|
126 |
except:
|
127 |
cs.send('start localport serverip:serverport\r\n')
|
128 |
continue
|
129 | |
130 |
thread.start_new_thread(mainserver,(l_port,s_ip,s_port))
|
131 |
cs.send('start OK!\r\n')
|
132 |
else:
|
133 |
cs.send('no command [%s]\r\n'%
cmd)
|
134 |
continue
|
135 | |
136 |
def
main():
|
137 |
globalstart
|
138 | |
139 |
iflen(sys.argv)
==
3:
|
140 |
try:
|
141 |
l_port=
int(sys.argv[1])
|
142 |
s_ip,s_port=
sys.argv[2].split(":")
|
143 |
s_port=
int(s_port)
|
144 |
thread.start_new_thread(mainserver,(l_port,s_ip,s_port))
|
145 |
except:
|
146 |
pass
|
147 | |
148 |
start=
1
|
149 | |
150 |
thread.start_new_thread(manager,(9000,))
|
151 | |
152 |
whilestart:
|
153 |
time.sleep(1)
|
154 | |
155 |
if
__name__ =='__main__':
|
156 | |
157 |
start=
0
|
158 | |
159 |
main()
|
本文介绍了一个简易的包转发服务器实现方案,该服务器具备基本管理功能,可通过telnet连接到localhost的9000端口进行操作。其核心作用是作为桥接服务器,使外网能够访问内网资源。
1034

被折叠的 条评论
为什么被折叠?



