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

#python #twisted

Вопрос:

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

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

В то время как я могу придумать, как сделать это с помощью раковины, чтобы перенести ее в «пользовательскую» оболочку… Я не могу понять, как сделать так, чтобы поток SSH работал так, как если бы он был реальным (я предпочтительно хочу ограничить /bin/bzr, чтобы bzr ssh работал.

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

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

Ответ №1:

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

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

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

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

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

Ответ №2:

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

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

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

Комментарии:

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