2015-04-20 2 views
0

Я в основном хочу создать веб-страницу, через которую можно получить доступ к терминалу unix на стороне сервера, и команды могут быть отправлены, и их результаты могут быть получены от терминала.Pseudo terminal не будет назначаться ошибка - ssh - sudo - websocket - subprocess

Для этого у меня есть WSGIServer. Когда соединение открыто, я выполнить следующее:

def opened(self): 
     self.p = Popen(["bash", "-i"], bufsize=1, stdin=PIPE, stdout=PIPE, stderr=STDOUT) 
     self.p.stdout = Unbuffered(self.p.stdout) 

     self.t = Thread(target=self.listen_stdout) 
     self.t.daemon = True 
     self.t.start() 

Когда сообщение приходит на сервер от клиента, он обрабатывается в следующей функции, которая только перенаправляет грядущее сообщение стандартного ввода подпроцесса p которых представляет собой интерактивный bash:

def received_message(self, message): 
    print(message.data, file=self.p.stdin) 

Затем выходы bash считывается в следующей функции в отдельном потоке t. Он только отправляет выходы клиенту.

def listen_stdout(self): 
    while True: 
     c = self.p.stdout.read(1) 
     self.send(c) 

В такой системе, я могу послать любую команду (ls, cd, mkdir и т.д.) в bash, работающих на стороне сервера и получить их выходы. Однако, когда я пытаюсь запустить ssh [email protected], отображается ошибка pseudo-terminal will not be allocated because stdin is not a terminal.

Аналогичным образом, когда я запускаю sudo ..., запрос на пароль не отправляется клиенту как-то, но он появляется на терминале серверного скрипта.

Я знаю expect; однако, только для таких sudo и ssh использования, я не хочу, чтобы мой код с expect. Вместо этого я ищу общее решение, которое может подделать sudo и ssh и перенаправить запрос клиенту.

Есть ли способ решить это? Идеи приветствуются, спасибо.

+0

Либо использовать 'expect' или пойти на' основе ключей SSH auth' и беспарольного Судо (опасному) – anishsane

+0

не какой-то шанс иметь решение, которое может выполнять все команды вместе с 'sudo' и' ssh'? –

+0

^^ Да, сценарий оболочки - это ответ. Но если какая-то команда ожидает входные данные по stdin, вы должны каким-то образом ее предоставить. 'ожидать' - это один из способов. – anishsane

ответ

0

Я нашел решение. Мне нужно было создать псевдотерминал. И, на стороне slavetty, сделайте вызов setsid(), чтобы сделать этот процесс новым сеансом и запустить команды на нем.

Подробности здесь: http://rachid.koucha.free.fr/tech_corner/pty_pdip.html

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