各位用户为了找寻关于Python实现网络端口转发和重定向的方法的资料费劲了很多周折。这里教程网为您整理了关于Python实现网络端口转发和重定向的方法的相关资料,仅供查阅,以下为您介绍关于Python实现网络端口转发和重定向的方法的详细内容
本文实例讲述了Python实现网络端口转发和重定向的方法。分享给大家供大家参考,具体如下:
【任务】
需要将某个网络端口转发到另一个主机(forwarding),但可能会是不同的端口(redirecting)。
【解决方案】
两个使用threading和socket模块的类就能完成我们需要的端口转发和重定向。
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90#encoding=utf8
#author: walker摘自《Python Cookbook(2rd)》
#date: 2015-06-11
#function: 网络端口的转发和重定向(适用于python2/python3)
import
sys, socket, time, threading
LOGGING
=
True
loglock
=
threading.Lock()
#打印日志到标准输出
def
log(s,
*
a):
if
LOGGING:
loglock.acquire()
try
:
print
(
'%s:%s'
%
(time.ctime(), (s
%
a)))
sys.stdout.flush()
finally
:
loglock.release()
class
PipeThread(threading.Thread):
pipes
=
[]
#静态成员变量,存储通讯的线程编号
pipeslock
=
threading.Lock()
def
__init__(
self
, source, sink):
#Thread.__init__(self) #python2.2之前版本适用
super
(PipeThread,
self
).__init__()
self
.source
=
source
self
.sink
=
sink
log(
'Creating new pipe thread %s (%s -> %s)'
,
self
, source.getpeername(), sink.getpeername())
self
.pipeslock.acquire()
try
:
self
.pipes.append(
self
)
finally
:
self
.pipeslock.release()
self
.pipeslock.acquire()
try
:
pipes_now
=
len
(
self
.pipes)
finally
:
self
.pipeslock.release()
log(
'%s pipes now active'
, pipes_now)
def
run(
self
):
while
True
:
try
:
data
=
self
.source.recv(
1024
)
if
not
data:
break
self
.sink.send(data)
except
:
break
log(
'%s terminating'
,
self
)
self
.pipeslock.acquire()
try
:
self
.pipes.remove(
self
)
finally
:
self
.pipeslock.release()
self
.pipeslock.acquire()
try
:
pipes_left
=
len
(
self
.pipes)
finally
:
self
.pipeslock.release()
log(
'%s pipes still active'
, pipes_left)
class
Pinhole(threading.Thread):
def
__init__(
self
, port, newhost, newport):
#Thread.__init__(self) #python2.2之前版本适用
super
(Pinhole,
self
).__init__()
log(
'Redirecting: localhost: %s->%s:%s'
, port, newhost, newport)
self
.newhost
=
newhost
self
.newport
=
newport
self
.sock
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self
.sock.bind(('', port))
self
.sock.listen(
5
)
#参数为timeout,单位为秒
def
run(
self
):
while
True
:
newsock, address
=
self
.sock.accept()
log(
'Creating new session for %s:%s'
,
*
address)
fwd
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
fwd.connect((
self
.newhost,
self
.newport))
PipeThread(newsock, fwd).start()
#正向传送
PipeThread(fwd, newsock).start()
#逆向传送
if
__name__
=
=
'__main__'
:
print
(
'Starting Pinhole port fowarder/redirector'
)
try
:
port
=
int
(sys.argv[
1
])
newhost
=
sys.argv[
2
]
try
:
newport
=
int
(sys.argv[
3
])
except
IndexError:
newport
=
port
except
(ValueError, IndexError):
print
(
'Usage: %s port newhost [newport]'
%
sys.argv[
0
])
sys.exit(
1
)
#sys.stdout = open('pinhole.log', 'w') #将日志写入文件
Pinhole(port, newhost, newport).start()
【讨论】
当你在管理一个网络时,即使是一个很小的网络,端口转发和重定向的功能有时也能给你很大的帮助。一些不在你的控制之下的应用或者服务可能是以硬连接的方式接入到某个特定的服务器的地址或端口。通过插入转发和重定向,你就能将对应用的连接请求发送到其他更合适的主机或端口上。
希望本文所述对大家Python程序设计有所帮助。