如何通过SSH服务Python CLI应用程序

时间:2011-08-19 03:12:09

标签: python ssh twisted

我正在用python编写一个带有Urwid前端和MongoDB后端的应用程序。最终目标是能够通过SSH为应用程序提供服务。该应用程序具有自己的身份验证/身份系统。我并不担心为每个用户启动新进程的开销,预期的并发用户数很少。由于客户端不会调用任何状态信息,而是全部存储在数据库中,除了身份验证之外,我并不关心会话。

我想知道是否有任何方法可以按原样提供应用程序,而无需使用自己的套接字服务器代码或使用Twisted重新编写应用程序代码。老实说,我不知道Urwid和Twisted是如何一起玩的。我看到Urwid有一个TwistedEventLoop方法,声称使用扭曲的反应器,但我找不到任何通过扭曲连接运行Urwid应用程序的示例代码。可以理解的例子,即使是简单的例子。我也看过ZeroMQ,但这似乎比Twisted更难以理解。简而言之,我探索了许多不同的库,这些库旨在通过tcp为应用程序提供服务,其中大多数都是通过telnet服务的。而且几乎所有人都专注于http。

最糟糕的情况我希望我可以创建一个极度锁定的用户作为全局登录并使用chrooted SSH会话。这样每个用户都可以获得自己的chroot / process / client。是的,我知道这可能是一个“非常糟糕的想法(tm)”。但我不得不把它扔出去作为一种可能性。

我感谢任何建设性的反馈。侮辱,谴责和傲慢将被愁眉苦脸,打印出来并吐口水。

-CH

3 个答案:

答案 0 :(得分:4)

Twisted有一个用于写这种事情的层:twisted.conch.insults。我要小心不要夸大它;它仍然需要更多的文档,缺乏一些功能。正如文档字符串所说,它“目前非常基本”。

侮辱是出于某种原因而出现的。我的理解是,即使在Twisted模式下,Urwid也直接与文件描述符对话,因此不能通过同一个线程加密和传输其输出;有人需要阅读该文件描述符的另一端。我相信Twisted模式更多的是使用Urwid控制台应用程序,它使用Twisted网络来实现其他的东西;正如您可能希望在客户端应用程序中或具有控制台视图的服务器中那样。

如果您不介意每个连接一个进程,您可以使用Conch编写SSH服务器,使用PTY将您的Urwid程序作为子进程生成,并提供有关其身份验证和环境的信息,例如,通过环境变量。查看spawnProcess API和Jean-Paul Calderone的excellent series on using Conch

答案 1 :(得分:1)

由于应用程序执行自己的身份验证,您可以通过xinetd转储它并让它处理I / O.然后,用户只需telnet到适当的端口并使其正常工作。

答案 2 :(得分:0)

一个廉价且非常危险的黑客攻击是将您的应用程序作为特定用户的默认shell。你需要非常小心(建议chroot到地狱和背部),因为它可能会突破应用程序并进入服务器。