所以我有一些普通的Python脚本,你可以通过你的终端正常访问。就像脚本适用于您的终端(这是一个游戏)。
现在我想以某种方式创建一个创建telnet服务器的脚本,当用户telnet到ip时,脚本将在他们的终端中运行。
我该怎么做?
答案 0 :(得分:0)
您可以使用 xinetd 添加启动python脚本的服务。标准输入和输出将通过网络在所需端口上传输,因此您无需修改脚本(input
/ raw_input
和print
方法可以正常工作。/ p>
简要教程: http://linuxpoison.blogspot.com/2010/01/how-to-add-custom-new-service-under.html
答案 1 :(得分:0)
我不会为此问题创建完整的代码。我将举一个简短的例子。
这是telnet server
:
list_of_the_connections = []
for connection in list_of_the_connections:
user_command = connection.read()
if user_command = 'name_of_the_script':
stdout = catch_stdout(os.system('python name_of_the_script'))
connection.send(stdout)
行stdout = catch_stdout(os.system('python name_of_the_script'))
使用os.system
运行bash命令,函数catch_stdout
捕获该命令的输出。稍后,您所要做的就是将此输出发送给用户。
答案 2 :(得分:0)
我有一个类似的问题,我通过调用我试图通过pexpect spawn类和telnet项目miniboa中的telnet连接的程序解决了这个问题。通过将程序包装在pexpect中,您可以安全地读取和写入stdin / stdout。
要使用输入功能,pexpect使用正则表达式来知道何时停止阅读并获取输入,因此我添加了'>'到我从stdin函数读取的结尾。
class Client(object):
def __init__(self, client):
self.client = client
self.process = pexpect.spawnu(PROGRAM)
def on_connect(client):
clients.append(Client(client))
def process_clients():
"""
Check each client, if client.cmd_ready == True then there is a line of
input available via client.get_command().
"""
for client in clients:
if client.active and client.cmd_ready:
# If the client sends input echo it to the chat room
interact(client)
def interact(client):
choice = client.process.expect([re.compile('\n*/>$'), '\n'])
if choice == 1: # not an input prompt
if len(client.process.before) == 0:
return
client.client.send(client.process.before+'\n')
else: #input
msg = client.client.get_command().strip()
client.process.sendline(msg)
if __name__ == "__main__":
tn = miniboa.TelnetServer(
port=7000,
address='127.0.0.1',
on_connect = on_connect
)
while True:
tn.poll()
if len(clients) > 0:
process_clients()
PROGRAM是要调用的程序。这主要是从miniboa示例中收集的。