背景
我并不是完全精通Python,我之前所做的大部分工作都是解析文本文件。虽然我意识到Telnet相当古老,但我将其用作教学示例。
我正在使用https://pypi.org/project/telnetsrvlib/中的telnetsrvlib向我的Python程序添加功能。
为了将所有内容都放在一个地方,以下是Threaded TelnetHandler的摘录:
class TelnetHandler(TelnetHandlerBase):
"A telnet server handler using Threading"
def __init__(self, request, client_address, server):
# This is the cooked input stream (list of charcodes)
self.cookedq = []
# Create the locks for handing the input/output queues
self.IQUEUELOCK = threading.Lock()
self.OQUEUELOCK = threading.Lock()
# Call the base class init method
TelnetHandlerBase.__init__(self, request, client_address, server)
def setup(self):
#Omitted here
def finish(self):
'''Called as the session is ending'''
TelnetHandlerBase.finish(self)
# Might want to ensure the thread_ic is dead
简短示例
class MyTelnetHandler(TelnetHandler):
@command(['echo', 'copy', 'repeat'])
def command_echo(self, params):
'''<text to echo>
Echo text back to the console.
'''
self.writeresponse( ' '.join(params) )
class TelnetServer(SocketServer.TCPServer):
allow_reuse_address = True
server = TelnetServer(("0.0.0.0", 8023), MyTelnetHandler)
telnetThread = threading.Thread(target=server.serve_forever, args=(1,))
telnetThread.daemon = True
telnetThread.start()
服务器将正确启动,运行并接受连接。当我按Ctrl-C
时,主进程终止,而telnetThread 除非终止,活动的Telnet会话也终止了。
通过附加gdb,我看到Telnet会话启动时创建了一个新线程。如果我手动终止会话线程,终止将继续进行。
(gdb)信息线程
10 Thread 0x7fffe57fb700 (LWP 3202) 0x00007ffff7827c2c in __libc_recv (
fd=<value optimized out>, buf=<value optimized out>, n=<value optimized out>,
flags=<value optimized out>) at ../sysdeps/unix/sysv/linux/x86_64/recv.c:34
9 Thread 0x7fffe61fc700 (LWP 3200) 0x00007ffff7827ca3 in recvfrom ()
at ../sysdeps/unix/syscall-template.S:82
3 Thread 0x7fffed2b1700 (LWP 3194) 0x00007ffff6edb6a3 in select ()
at ../sysdeps/unix/syscall-template.S:82
* 1 Thread 0x7ffff7fe5700 (LWP 3190) sem_wait ()
at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86
最新的线程#10是Telnet会话。
问题
如何强制服务器关闭任何活动会话?