【问题标题】:Python - How to use Conch to create a Virtual SSH serverPython - 如何使用 Conch 创建虚拟 SSH 服务器
【发布时间】:2023-12-17 22:21:01
【问题描述】:

我正在考虑在 python 中创建一个可以运行的服务器,并将用作 SSH 服务器。然后,这将允许不同的用户登录,就像他们正常登录一样,但只能访问一个命令。

我想这样做,以便我可以拥有一个可以添加用户的系统,而无需创建系统范围的帐户,这样他们就可以提交到 VCS 分支或类似的分支。

p>

虽然我可以弄清楚如何使用 conch 将其放入“自定义”外壳中......但我不知道如何制作它,以便 SSH 流像真实的一样工作(我希望限制为 /bin/bzr 以便 bzr+ssh 可以工作。

它需要在 python 中(我可以进行授权),但不知道如何链接到应用程序。

这需要在 python 中才能在其设计的应用程序中工作,并且能够用于那些无权添加新用户的人

【问题讨论】:

    标签: python twisted


    【解决方案1】:

    当您编写 Conch 服务器时,您可以通过实现 ISession.openShell 来控制客户端发出 shell 请求时发生的情况。 Conch 服务器将从您的领域请求IConchUser,然后将生成的头像调整为ISession,以便在必要时调用openShell

    ISession.openShell 的工作是获取传递给它的传输对象并将其与协议相关联,以解释从它接收到的字节,并在需要时将字节写入它以发送给客户端。

    不幸的是,传递给openShell 的表示传输的对象实际上是IProcessProtocol 提供程序。这意味着您需要在其上调用makeConnection,并传递一个IProcessTransport 提供程序。当从客户端接收到数据时,IProcessProtocol 将在您传递给makeConnection 的传输上调用writeToChild。当你想向客户端发送数据时,你应该调用childDataReceived就可以了。

    要查看确切的行为,我建议阅读the implementation of the IProcessProtocol that is passed in。不要依赖不属于IProcessProtocol 的任何内容,但查看实现可以更容易理解发生了什么。

    您可能还想查看the implementation of the normal shell-creation 以了解您的目标。这将为您提供有关如何将您启动的 bzr 子进程的 stdio 与 SSH 通道相关联的线索。

    【讨论】:

      【解决方案2】:

      虽然 Python 确实是我最喜欢的语言,但我认为您无需为此创建自己的服务器。当您查看OpenSSH Manualpage for sshd 时,您会发现授权密钥文件的“命令”选项,可让您定义在登录时运行的特定命令。

      使用密钥,您可以使用一个系统帐户允许多个用户登录,只需将他们的公钥放入帐户的授权密钥文件中即可。

      我们正在使用它为 SVN 创建 SSH 隧道,效果很好。

      【讨论】:

      • 这不是我想要的。它需要在 python 中(我可以进行授权),但不知道如何链接到应用程序。这需要在 python 中才能在其设计的应用程序中工作,并且能够用于那些无权添加新用户的人