Я в основном хочу создать веб-страницу, через которую можно получить доступ к терминалу 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
и перенаправить запрос клиенту.
Есть ли способ решить это? Идеи приветствуются, спасибо.
Либо использовать 'expect' или пойти на' основе ключей SSH auth' и беспарольного Судо (опасному) – anishsane
не какой-то шанс иметь решение, которое может выполнять все команды вместе с 'sudo' и' ssh'? –
^^ Да, сценарий оболочки - это ответ. Но если какая-то команда ожидает входные данные по stdin, вы должны каким-то образом ее предоставить. 'ожидать' - это один из способов. – anishsane