我期待开发一个远程系统管理 Web 应用程序(例如 Webmin)。显然,我将需要调用由 root 或其他特定非 nobody 用户发出的要执行的 shell 命令。
这项任务的一般准则是什么?
现在我想到的唯一解决方案是在一个特殊端口上运行 Web 服务器,该端口(通过防火墙)只能供本地和 VPN 连接的用户访问。但是也许有一些特殊的技巧可以保护这样的应用程序,即使它暴露在公共(public)网络上也是如此?
最佳答案
由于我们讨论的是控制 native 任务的网络应用程序,因此您需要考虑几个方面(至少对于 Java,但通常对于每个设计良好的解决方案):
- 使用异步模型来执行 native 任务,因为其中一些任务可能需要相当长的时间,并且在浏览器中,用户不知道是机器或互联网出现问题还是其他原因。
- 不要直接使用 Java Runtime#exec(),因为很容易导致无法正常工作或出错,或者代码在不同机器上的行为不同,或者至少要小心使用:参见 JavaWorld article关于可能的陷阱。
- 如果可能将应用程序分为两部分:网络应用程序和执行任务(并与网络应用程序安全通信)的“ headless 代理”。通过这种方式,您可以通过一个网络应用程序控制多台机器(只安装了“代理”),当一台机器出现问题时,网络应用程序仍然可以响应,并且可能会启动所需的恢复步骤。
- 当在同一台机器上运行时(web 应用程序和代理及其可执行命令),如果应用程序“搬起石头砸自己的脚”,您需要一个“备份计划”,从而影响您对机器的访问。
关于java - 从 PHP/Java/Python Web 应用程序调用 shell 命令(包括那些需要 root 权限的命令)的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3299202/