ボットが使用しているユーザ名/パスワードのペアをログアウトするシンプルな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'
それを修正する方法任意のアイデア:
エラー「繰延で未処理のエラー」が発生した次は、私はこれは私のログを取得しますか?ここで
質問に完全で正確なエラーを追加してください(コピー/貼り付け)。 –
ええ、私はしました。正確なエラーメッセージは、コンソールに表示されている「処理されていないエラー」です。明らかに致命的なエラーではありません。なぜなら、スクリプトは壊れておらず、バックトレースもありませんが、それは私のスクリプトではないので何らかのエラーや警告です。 – bontchev
これがすべて表示されている場合は、このロギングバグを持つTwistedのバージョンを使用していると思います。その場合、静かに落とされている障害に関する有用な詳細があります。おそらく、問題を回避するためにロギングの設定を変更したり、Twistedのバージョンを十分に古いバージョンにダウングレードしたり、バグを修正してからアップグレードしたりすることで、それらを見ることができます。 –