在Python中通过Telnet运行脚本

时间:2016-05-21 09:36:33

标签: python server telnet

所以我有一些普通的Python脚本,你可以通过你的终端正常访问。就像脚本适用于您的终端(这是一个游戏)。

现在我想以某种方式创建一个创建telnet服务器的脚本,当用户telnet到ip时,脚本将在他们的终端中运行。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

您可以使用 xinetd 添加启动python脚本的服务。标准输入和输出将通过网络在所需端口上传输,因此您无需修改​​脚本(input / raw_inputprint方法可以正常工作。

简要教程: 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示例中收集的。