如何通过SSH提供Python CLI应用程序

5 投票
3 回答
697 浏览
提问于 2025-04-16 23:55

我正在写一个应用程序,前端用的是Urwid,后端用的是MongoDB,都是用Python写的。我的最终目标是能够通过SSH来提供这个应用。这个应用有自己的身份验证系统。我不太担心每个用户启动一个新进程的开销,因为预计同时在线的用户数量不多。由于客户端不保存任何状态信息,所有信息都存储在数据库里,所以我对会话管理不太关心,除了身份验证的需要。

我在想有没有什么方法可以直接提供这个应用,而不需要自己写一个socket服务器的代码,也不想用Twisted重新编写应用。我老实说,不太清楚Urwid和Twisted是怎么一起工作的。我看到Urwid有一个TwistedEventLoop的方法,声称可以使用Twisted的反应器,但我找不到任何在Twisted连接上运行Urwid应用的示例代码。如果有简单的例子就太好了。我也看过ZeroMQ,但感觉比Twisted还要复杂。总之,我探索了很多不同的库,声称可以通过tcp提供应用,大多数是通过telnet实现的,而几乎所有的都专注于http。

在最坏的情况下,我想我可能会创建一个非常受限的用户作为全局登录,并使用chroot的SSH会话。这样每个用户就能拥有自己的chroot/进程/客户端。是的,我知道这可能是个“非常糟糕的主意”。但我还是想把这个可能性提出来。

我很感激任何建设性的反馈。侮辱、嘲讽和傲慢的态度我会不屑一顾,甚至会打印出来然后吐掉。

-CH

3 个回答

0

一个便宜但可能非常危险的黑科技是把你的应用设置成某个用户的默认命令行工具。不过你需要非常小心(建议把它放在一个安全的环境里),因为有可能会从这个应用中逃出来,进入到服务器的其他部分。

1

因为这个应用程序自己处理用户认证,所以你可以通过 xinetd 来管理它,让 xinetd 来处理输入和输出。这样,用户只需要通过 telnet 连接到相应的端口,就可以正常使用了。

4

Twisted有一个专门用来写这种东西的模块:twisted.conch.insults。我想提醒大家不要过于夸大它的功能;它的文档还不够完善,有些功能也还不够齐全。正如文档里所说,它目前“非常基础”。

不过,Insults这个模块的出现是有原因的。我的理解是,Urwid在使用Twisted模式时,实际上是直接和一个文件描述符进行交互,因此它的输出不能在同一个线程中被加密和传输;需要有人在文件描述符的另一端读取数据。我认为Twisted模式更多的是为了让一个控制台应用程序使用Urwid,同时利用Twisted的网络功能;这在客户端应用程序或者有控制台视图的服务器中可能会用到。

如果你不介意每个连接都用一个进程的话,你可以使用Conch写一个SSH服务器,这个服务器可以通过PTY启动你的Urwid程序作为一个子进程,同时提供关于身份验证和环境的信息,比如通过环境变量来传递。可以查看一下spawnProcess API,还有Jean-Paul Calderone的关于使用Conch的精彩系列文章

撰写回答