2016-05-21 4 views
1

, поэтому у меня есть некоторые обычные скрипты Python, которые вы можете получить через свой терминал в обычном режиме. Как скрипт работает с вашим терминалом (это игра).Запуск сценария через Telnet в Python

Теперь я хочу как-то создать сценарий, создающий сервер telnet, и когда пользовательский telnet-сервер будет работать с ip, скрипт будет работать в своем терминале.

Как это сделать?

+0

Взгляните на https://pypi.python.org/pypi/miniboa. Это небольшой и легкий сервер telnet для python. Но я не уверен, что все понимаю. Вы хотите скопировать скрипт через telnet с сервера на клиентский ip? – Laszlowaty

+0

@ Laszlowaty: Я посмотрю на это скоро. В основном я хочу, чтобы сценарий создавал сервер telnet, и когда какой-то пользователь подключается к этому серверу telnet, он запускает еще один скрипт python, размещенный на том же компьютере, что и сервер telnet. В основном позволяет им получить доступ к сценарию, который я использую через telnet. – prestotron

+0

Ну, это просто фея. На сервере просто прочитайте пользовательский ввод, а затем правильный вход 'if' просто используйте команду os.system ('command'), чтобы запустить ваш скрипт и вывести stdout и отправить его пользователю. Но это немного проблема безопасности (не позволяйте писать какую-либо команду), только тот, который разрешен. – Laszlowaty

ответ

0

Вы можете использовать xinetd, чтобы добавить сервис, начинающийся с вашего скрипта python. Стандартный ввод и вывод будет передаваться по сети на нужном порту, поэтому вам не нужно изменять свои сценарии (input/raw_input и print методы будут работать нормально).

Краткий учебник: http://linuxpoison.blogspot.com/2010/01/how-to-add-custom-new-service-under.html

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) 

Line stdout = catch_stdout(os.system('python name_of_the_script')) использует os.system для выполнения команды и функции BASh catch_stdout уловов выхода этой команды. Позже все, что вам нужно сделать, это отправить этот вывод пользователю.

0

У меня была аналогичная проблема, которую я решил, вызвав программу, которую я пытался подключить к telnet, в класс spawn pexpect и проект telnet miniboa. Обернув программу в 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() 

ПРОГРАММА - программа, которая будет называться. Это в основном почерпнуто из примеров miniboa.

Смежные вопросы