WEB开发网
开发学院软件开发Python 使用 Twisted 框架进行网络编程,第 4 部分 阅读

使用 Twisted 框架进行网络编程,第 4 部分

 2008-11-13 13:13:47 来源:WEB开发网   
核心提示: 清单3. scp.py (修改过的 Channel 方法)def dataReceived(self, data):open(DST,'wb').write(data)self.closed()(变量 CMD 的值设置为 "cat "+sys.argv[

清单3. scp.py (修改过的 Channel 方法)

  def dataReceived(self, data):
  open(DST,'wb').write(data)
  self.closed()

(变量 CMD 的值设置为 "cat "+sys.argv[2] 。)

哈哈!我已经实现了很多 SSH 客户机的 scp 工具。

这些例子都是“运行并收集”类型的工具。也就是说,它们在会话期间并没有交互。不过你可以很简单地创建另一个工具,另外在 Channel 方法中调用 self.conn.sendRequest() 。实际上如果客户机是某种 GUI 客户机,您就可以加入一些数据收集的表单,作为反应器中的回调。换句话说,当某个特定的表单结束之时,也许新的远程命令会发送过来,这时收集结果、然后处理或显示的工作就会再次开始。

SSH Weblog 服务器

SSH 服务器使用的结构与客户机大致相同。与前面一样,我对 doc/examples/sshsimpleserver.py 进行了简化与定制,以适应我的例子。其中一种处理是:服务器最好由用适当的密钥和类配置过的的 SSHFactory 子类创建:

在我们的 SSH Weblog 服务器中,我们为一名经过授权的用户配置了密码和用户名。在本例中,这些配置是硬编码的,但是您显然可以将其存储在其他的地方;比方说可以配置一个授权 Weblog 监视器列表。下面让我们来看看这个例子:

清单4. ssh-weblog-server.py

#!/usr/bin/env python2.3
from twisted.cred import authorizer
from twisted.conch import identity, error
from twisted.conch.ssh import userauth, connection, channel, keys
from twisted.conch.ssh.factory import SSHFactory
from twisted.internet import reactor, protocol, defer
import time
class Identity(identity.ConchIdentity):
  def validatePublicKey(self, data):
    return defer.succeed('')
  def verifyPlainPassword(self, password):
    if password=='password' and self.name == 'user':
      return defer.succeed('')
    return defer.fail(error.ConchError('bad password'))
class Authorizer(authorizer.Authorizer):
  def getIdentityRequest(self, name):
    return defer.succeed(Identity(name, self))
class Connection(connection.SSHConnection):
  def gotGlobalRequest(self, *args):
    return 0
  def getChannel(self, channelType, windowSize, maxPacket, data):
    if channelType == 'session':
      return Channel(remoteWindow=windowSize,
           remoteMaxPacket=maxPacket, conn=self)
    return 0
class Channel(channel.SSHChannel):
  def channelOpen(self, data):
    weblog = open('../access.log')
    weblog.readlines()
    while 1:
      time.sleep(5)
      for rec in weblog.readlines():
        self.write(rec)
  def request_pty_req(self, data):
    return 1  # ignore, but this gets send for shell requests
  def request_shell(self, data):
    self.client = protocol.Protocol()
    self.client.makeConnection(self)
    self.dataReceived = self.client.dataReceived
    return 1
  def loseConnection(self):
    self.client.connectionLost()
    channel.SSHChannel.loseConnection(self)
class Factory(SSHFactory):
  publicKeys = {'ssh-rsa':keys.getPublicKeyString(
              data=open('~/.ssh/id_rsa.pub').read())}
  privateKeys ={'ssh-rsa':keys.getPrivateKeyObject(
              data=open('~/.ssh/id_rsa').read())}
  services = {'ssh-userauth': userauth.SSHUserAuthServer,
        'ssh-connection': Connection}
  authorizer = Authorizer()
reactor.listenTCP(8022, Factory())
reactor.run()

上一页  1 2 3 4 5 6  下一页

Tags:使用 Twisted 框架

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接