Python - Как использовать Conch для создания виртуального SSH-сервера
Вопрос
Я смотрю на создание сервера на 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, и это прекрасно работает.