Python - 如何使用Conch创建虚拟SSH服务器

5 投票
2 回答
2293 浏览
提问于 2025-04-11 09:27

我想用Python创建一个服务器,这个服务器可以作为SSH服务器运行。这样,不同的用户就可以登录,感觉就像他们正常登录一样,但只能使用一个命令。

我想这样做是为了能有一个系统,可以添加用户,而不需要为每个用户创建一个系统级的账户。这样他们就可以,比如说,提交到一个版本控制系统的分支,或者类似的操作。

虽然我知道怎么用conch来实现一个“自定义”的shell,但我搞不清楚怎么让SSH连接看起来像一个真实的连接(我希望限制在/bin/bzr,这样bzr+ssh就能正常工作)。

这个程序需要用Python写(我可以用它来处理授权),但我不知道怎么把它和应用程序连接起来。

这必须用Python来实现,以便在它设计的应用程序中工作,并且能够被那些没有权限添加新用户的人使用。

2 个回答

-2

虽然Python确实是我最喜欢的编程语言,但我觉得你不需要自己搭建服务器。你可以查看OpenSSH的sshd手册,里面有关于授权密钥文件的“命令”选项,这个选项可以让你在登录时定义一个特定的命令来执行。

通过使用密钥,你可以让一个系统账户允许多个用户登录,只需把他们的公钥放到这个账户的授权密钥文件里就可以了。

我们就是用这个方法为SVN创建SSH隧道,效果非常好。

7

当你写一个Conch服务器时,你可以通过实现 ISession.openShell 来控制客户端发起的shell请求时发生什么。Conch服务器会从你的领域请求 IConchUser,然后将得到的用户对象适配为 ISession,如果需要的话,就会调用 openShell

ISession.openShell 的任务是接收传入的传输对象,并将其与一个协议关联起来,以便解释从中接收到的字节数据,并在需要时将字节数据写入其中,以发送给客户端。

不幸的是,传递给 openShell 的传输对象实际上是一个 IProcessProtocol 提供者。这意味着你需要在它上面调用 makeConnection,并传递一个 IProcessTransport 提供者。当从客户端接收到数据时,IProcessProtocol 会在你传递给 makeConnection 的传输对象上调用 writeToChild。当你想要发送数据给客户端时,你应该在它上面调用 childDataReceived

为了更好地理解具体的行为,我建议你阅读 传递的 IProcessProtocol 的实现。不要依赖于任何不属于 IProcessProtocol 的内容,但查看实现可以帮助你更好地理解发生了什么。

你可能还想看看 正常的shell创建实现,以了解你要实现的目标。这将给你一个线索,关于如何将你启动的bzr子进程的标准输入输出与SSH通道关联起来。

撰写回答