返回目录


Twisted服务器开发技巧(2) - 端口与权限的游戏

1. Twisted服务器开发技巧(2) - 端口与权限的游戏

1024,这个数字在端口中代表着权限。如果你不是root,哪么将不能随便启动这个数字以内的侦听端口。但有时,你却希望用一个非root用户来进行这个服务的处理。当然,除了这些,Twisted还有一些有效的帮助你进行服务运行的功能。

接上次,我们来看以下代码:

   1 from twisted.internet import protocol, reactor, defer, utils
   2 from twisted.protocols import basic
   3 class FingerProtocol(basic.LineReceiver):
   4     def lineReceived(self, user):
   5         self.factory.getUser(user
   6         ).addErrback(lambda _: "Internal error in server"
   7         ).addCallback(lambda m:
   8                       (self.transport.write(m+"\r\n"),
   9                        self.transport.loseConnection()))
  10 class FingerFactory(protocol.ServerFactory):
  11     protocol = FingerProtocol
  12     def getUser(self, user):
  13         return utils.getProcessOutput("finger", [user])
  14 reactor.listenTCP(1079, FingerFactory())
  15 reactor.run()

我希望让它运行于hd用户whell组的权限下,侦听的端口是79。显然是不好搞的事,但是twisted却是轻松的事:

   1 application = service.Application('finger', uid=1000, gid=0)
   2 factory = FingerFactory()
   3 internet.TCPServer(79, factory).setServiceParent(
   4     service.IServiceCollection(application))

使用这三行,换了最后的ractor的设置和运行。保存为finger.tac文件。

如果我用python finger.py来运行,在ps命令时得到的就是:

root  95883  3.2  3.8  6044 4836  p1  S+   11:26下午  0:00.26 python finger.py

但如果我用

twisted -ny finger.tac

就将看到:

hd  95886 2.5 4.5 6888 5660 p1 S+  11:27下午 0:00.29 /usr/local/bin/python /usr/local/bin/twistd -ny finger.tac

显然,我们的服务运行在了79端口上,而且是使用了hd用户的身分来运行。

其实,twisted命令还给我们提供了许多有用的参数:

root% twistd -ny finger.tac # just like before
root% twistd -y finger.tac # daemonize, keep pid in twistd.pid
root% twistd -y finger.tac --pidfile=finger.pid
root% twistd -y finger.tac --rundir=/
root% twistd -y finger.tac --chroot=/var
root% twistd -y finger.tac -l /var/log/finger.log
root% twistd -y finger.tac --syslog # just log to syslog
root% twistd -y finger.tac --syslog --prefix=twistedfinger # use given prefix

大家仔细试试罢。我们可以节省大量的时间来写业务逻辑,而不用去考虑这些系统功能的问题了。啊门,感谢佛祖给了我们这么多好东东哟。


返回目录