2

我需要从我的 Servlet 中调用一些 Unix 命令。我有一些 Perl 脚本,但我想将它们“翻译”成 Java。这是我想在 Java 上做的事情,但我是用 Perl 做的:

system("myfolder/myscript.sh > /myfolder/logs/myscript.log");

是否可以在 Servlet 上执行此操作?

4

3 回答 3

4

是的,但请注意,重定向是您想要的 shell 的一部分:

ProcessBuilder pb = 
   new ProcessBuilder("/bin/sh", "-c", "myfolder/myscript.sh > /myfolder/logs/myscript.log");
pb.start();
于 2012-12-27T14:24:35.420 回答
3

简短的回答:

这是可能的,但这是糟糕的设计,并且可能带来安全风险。最好以某种方式标记脚本需要运行并通过脚本检查标志

长答案(在评论之后):

Servlet 通常用于为某事提供用户界面(或 api),例如访问数据或在您的情况下触发操作。因此,它们暗示了从远程资源(例如远程计算机)进行访问的可能性。在某些(实际上是大多数)情况下,远程计算机甚至可能不在网络中,例如某人的家。

暴露于外部世界的每台服务器都有可能以某种方式被黑客入侵或攻击,风险与该资源所带来的兴趣程度直接相关。

例如,如果您为一家大公司工作(这会被黑客注意到),并且此 servlet 用于触发本地存储库中的构建,并且您决定开发人员将能够在家工作并且需要登录为了触发构建或检查其构建状态,这意味着任何拥有正确凭据的人都可以从世界任何地方访问 servlet。现在让我们假设您的 perl 脚本需要访问您的 CI 服务器以获取某些数据,并且需要访问您的源存储库以获取其他数据(也许它甚至复制源而不是让 CI 服务器这样做)。在这种情况下,您只是在世界某个地方的某个人与公司的源代码之间创建了直接链接。这也意味着,即使它' 很难渗透您难以置信的安全服务,因为您花费了大量时间来弥补所有潜在的差距,它们仍然可能触发许多不必要的构建,如果您在持续部署中工作,甚至使这些构建投入生产(可能导致DOS 攻击或服务中断)。如果在某些时候有人决定脚本也需要从 servlet 中获取参数,那么您甚至可以让黑客的生活变得更轻松,最终可以让他访问您的系统。

我在上一段中描述的所有内容可能与您的情况完全无关,您可能正在开发一项服务,该服务将在您的家用计算机上运行并且除了您自己之外不会引起任何人的兴趣,但这并不能改变这是一个糟糕的设计这一事实(顺便说一句,这可能适合家庭使用)。

我在简短的回答中说的是,最好让 servlet 标记系统需要采取行动,例如在数据库甚至文件中设置一个标志,在这种情况下,黑客的生活会更加困难,因为有没有直接链接。这也使 servlet 立即响应,可能会自动更新状态,而不是等待 perl 脚本完成运行。

于 2012-12-27T14:05:29.437 回答
0

你试过Jsch 吗?它可以做 ssh 和执行 shell 命令。

于 2012-12-27T14:15:01.020 回答