2017-09-04 12 views
0

ボットが使用しているユーザ名/パスワードのペアをログアウトするシンプルなTelnetサーバを作成しようとしています。 、など)。私はこの目的のためにTwistedを使用しようとしています、それはそのような目的のための最先端技術であるように思われるからです。TwistedのTelenetサーバが "未処理のエラーを遅延させました"というエラーを受け取りました

これは私がこれまでに作ったものです:

#!/usr/bin/env python 

from twisted.conch.telnet import TelnetTransport, TelnetProtocol, ECHO 
from twisted.internet.protocol import ServerFactory 
from twisted.application.internet import TCPServer 
from twisted.application.service import Application 
from twisted.internet import reactor 

import logging 

class TelnetEcho(TelnetProtocol): 

    ip = '' 
    user = '' 
    state = '' 
    line = '' 

    def connectionMade(self): 
     self.ip = self.transport.getPeer().host 
     self.transport.write('Username: ') 
     self.transport.will(ECHO) 
     self.state = 'User' 

    def dataReceived(self, data): 
     if self.state != 'Password': 
      self.transport.write(data) 
     self.line += data 
     if data == '\n': 
      self.processLine() 
      self.line = '' 
     return 

    def processLine(self): 
     if self.state == 'User': 
      self.user = self.line.strip() 
      self.transport.write('Password: ') 
      self.state = 'Password' 
     elif self.state == 'Password': 
      print 'IP: ' + self.ip + ', user:' + self.user + ', pass:' + self.line.strip() 
      logging.info(self.ip + ',' + self.user + ',' + self.line.strip()) 
      self.transport.write('\r\nIncorrect password or username.\r\n') 
      self.transport.write('Username: ') 
      self.state = 'User' 

def CreateMyFactory(): 
    factory = ServerFactory() 
    factory.protocol = lambda: TelnetTransport(TelnetEcho) 
    return factory 

if __name__ == "__main__": 
    logging.basicConfig(filename='telnet.log', format='%(message)s', level=logging.DEBUG) 
    logging.info('Tmestamp,IP,Username,Password') 
    for handler in logging.root.handlers[:]: 
     logging.root.removeHandler(handler) 
    logging.basicConfig(filename='telnet.log', format='%(asctime)s,%(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.DEBUG) 
    MyFactory = CreateMyFactory() 
    reactor.listenTCP(23, MyFactory) 
    reactor.run() 

そして、それはほとんどが正常に動作します - 私は意味、ボットがログインしようとすると、それは彼らが使用する資格情報をログに記録します - しかし、私は去るUnhandled error in Deferredエラーを得続けます私は完全に神秘的でした。私は、意図的にではなく、延期を使用していません。何が原因でエラーが発生し、問題を解決するのですか?

興味深いことに、サーバーに手動でtelnetして自分でユーザー名/パスワードを入力しようとすると、エラーは表示されません。ボットがログインしようとしているときにのみ表示されます。私のボットは、私のサーバーが会計処理していないことをしようとしていると思いますが、私は何をすべきか分かりません。


編集:

私の代わりにPythonのロガーのツイストロガーを使用するために上記のスクリプトを変更しました。今、ログにいくつかの追加情報があります。まず、次の警告が表示されます。

2017-09-06 16:17:01+0300 [-] Warning: primary log target selected twice at <c:\python\lib\site-packages\twisted\application\app.py:212> - previously selected at <c:\python\lib\site-packages\twisted\python\log.py:214>. Remove one of the calls to beginLoggingTo. 

これは、Twistedのバグです。

2017-09-06 16:33:33+0300 [-] Unhandled error in Deferred: 
2017-09-06 16:33:33+0300 [-] Unhandled Error 
    Traceback (most recent call last): 
    Failure: twisted.conch.telnet.OptionRefused: twisted.conch.telnet.OptionRefused:'\x01' 

それを修正する方法任意のアイデア:

エラー「繰延で未処理のエラー」が発生した次は、私はこれは私のログを取得しますか?ここで

+0

質問に完全で正確なエラーを追加してください(コピー/貼り付け)。 –

+0

ええ、私はしました。正確なエラーメッセージは、コンソールに表示されている「処理されていないエラー」です。明らかに致命的なエラーではありません。なぜなら、スクリプトは壊れておらず、バックトレースもありませんが、それは私のスクリプトではないので何らかのエラーや警告です。 – bontchev

+0

これがすべて表示されている場合は、このロギングバグを持つTwistedのバージョンを使用していると思います。その場合、静かに落とされている障害に関する有用な詳細があります。おそらく、問題を回避するためにロギングの設定を変更したり、Twistedのバージョンを十分に古いバージョンにダウングレードしたり、バグを修正してからアップグレードしたりすることで、それらを見ることができます。 –

答えて

0

Deferredの使用だ:ここでは

self.transport.will(ECHO) 

willのためのAPIドキュメントは、次のとおりです。あなたの場合は

def will(option): 
    """ 
    Indicate our willingness to begin performing this option locally. 

    Returns a Deferred that fires with True when the peer agrees to allow us 
    to begin performing this option, or fails with L{OptionRefused} if the 
    peer refuses to allow us to begin performing it. If the option is 
    already enabled locally, the Deferred will fail with L{AlreadyEnabled}. 
    If negotiation regarding this option is already in progress, the 
    Deferred will fail with L{AlreadyNegotiating}. 

    Note: It is currently possible that this Deferred will never fire, 
    if the peer never responds, or if the peer believes the option to 
    already be enabled. 
    """ 

、ピアはECHO機能を実行するために、あなたの申し出を拒否しています。また

d = self.transport.will(ECHO) 
    d.addErrback(lambda reason: reason.trap(OptionRefused)) 

あなたがもしことを追加することもできますので、あなたが実際にアプリで任意のエコーのロジックを持っていないことに注意してください:あなたは、この拒否の報告を抑制したい場合は、その例外タイプを飲み込むするエラーバックを追加あなたはエコーをするように申し出るつもりです。そして、Usernameプロンプトの代わりに、PasswordプロンプトのまわりでECHO交渉をするつもりは望むかもしれません。 ECHO交渉の目的は、通常、パスワードのエコーを抑止することです。

+0

OK、あなたが提案した修正を行いましたが、このエラーが発生しています。ログに 'Failure:twisted.internet.error.ConnectionLost:相手側への接続が非クリーンな方法で失われました:Connection lost.'と' Failure:twisted.conch.telnet.AlreadyDisabled:twisted.conch.telnet。 AlreadyDisabled: '\ x01' '。複数のエラーをトラップするにはどうすればよいですか?カンマで区切ったリストなどで表示しますか? – bontchev

+0

https://twistedmatrix.com/documents/17.5.0/api/twisted.python.failure.Failure.html#trap –

+0

ありがとうございます。リスト( 'AlreadyNegotiating'と' ConnectionDone')をもう少し追加しなければなりませんでしたが、最終的にエラーメッセージを抑制することができました。 – bontchev

関連する問題