Python - Как использовать Conch для создания виртуального SSH-сервера

StackOverflow https://stackoverflow.com/questions/186316

  •  06-07-2019
  •  | 
  •  

Вопрос

Я смотрю на создание сервера на python, который я могу запустить и который будет работать как SSH-сервер. Это позволит другим пользователям войти в систему и вести себя так, как если бы они вошли в систему в обычном режиме, но имели доступ только к одной команде.

Я хочу сделать это, чтобы у меня была система, в которую я мог бы добавлять пользователей без необходимости создания общесистемной учетной записи, чтобы они могли, например, зафиксировать ветку VCS или подобное.

Хотя я могу понять, как это сделать с помощью conch, чтобы перейти к " custom " shell ... Я не могу понять, как сделать так, чтобы поток SSH работал так, как если бы он был реальным (желательно, чтобы я ограничил его / bin / bzr, чтобы bzr + ssh работал.

Он должен быть на python (который я могу получить для авторизации), но не знаю, как сделать ссылку на приложение.

Это должно быть на python, чтобы работать в приложении, для которого оно разработано, и иметь возможность использовать его для тех, у кого нет доступа для добавления новых пользователей

Это было полезно?

Решение

Когда вы пишете сервер Conch, вы можете контролировать, что происходит, когда клиент делает запрос оболочки, реализуя ISession.openShell . Сервер Conch запросит IConchUser из вашей области, а затем адаптируйте полученный аватар для ISession , чтобы вызвать openShell для него при необходимости.

Работа

ISession.openShell состоит в том, чтобы взять переданный ему транспортный объект и связать его с протоколом, чтобы интерпретировать полученные от него байты и, при желании, записать в него байты, чтобы отправлено клиенту.

К несчастью, объект, переданный в openShell , представляющий транспорт, на самом деле является IProcessProtocol . Это означает, что вам нужно позвонить в makeConnection , передавая IProcessTransport . Когда данные получены от клиента, IProcessProtocol вызовет writeToChild на транспорте, который вы передаете makeConnection . Если вы хотите отправить данные клиенту, вам следует вызвать childDataReceived на нем.

Чтобы увидеть точное поведение, я предлагаю прочитать реализация IProcessProtocol , который передается в . Не зависите от чего-либо, что не является частью IProcessProtocol , но, увидев реализацию, можно легче понять, что происходит.

Вы также можете посмотреть на реализация обычного создания оболочки , чтобы понять, к чему вы стремитесь. Это даст вам представление о том, как связать stdio дочернего процесса bzr, который вы запускаете, с каналом SSH.

Другие советы

Хотя Python действительно мой любимый язык, я думаю, вам не нужно создавать собственный сервер для этого. Когда вы смотрите на страницу руководства OpenSSH для sshd , вы найду команду " опции для файла авторизованных ключей, который позволяет вам определить конкретную команду для запуска при входе в систему.

Используя ключи, вы можете использовать одну системную учетную запись, чтобы позволить многим пользователям войти в систему, просто поместите свои открытые ключи в файл авторизованных ключей учетной записи.

Мы используем это для создания SSH-туннелей для SVN, и это прекрасно работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top