2012-12-27 65 views
2

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

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

是否有可能做到这一点的一个Servlet?

回答

4

是的,但要注意重定向是外壳的一部分,你会想:

ProcessBuilder pb = 
    new ProcessBuilder("/bin/sh", "-c", "myfolder/myscript.sh > /myfolder/logs/myscript.log"); 
pb.start(); 
+0

您选择在此处使用Process而不是ProcessBuilder的原因是什么? – orangepips

+0

没有特别的理由。两者都会工作:) – Reimeus

+0

谢谢您的编辑了;) – abierto

3

简短回答:

这是可能的,但它是不好的设计,并可能构成安全风险。 更好地标记不知何故,该脚本需要运行,并通过脚本检查标志

朗答案(按照commments):

的Servlet通常用于提供用户界面(或API)的东西,对于例如访问数据或触发行动。因此,这意味着可以从远程计算机等远程资源进行访问。在一些(实际上大多数情况下)情况下,该远程计算机甚至可能脱离网络,例如某人的家。

每个暴露于外部世界的服务器都有可能以某种方式被黑客入侵或攻击,其风险直接与此资源的利益水平相关。例如,如果你为一家大公司工作(然后黑客会注意到这个公司),并且这个servlet用于触发你本地存储库中的构建,并且你决定开发人员能够在家工作,需要登录才能触发构建或检查其构建状态,这意味着具有正确凭据的任何人都可以从世界任何地方访问该servlet。现在让我们假设你的perl脚本需要访问你的CI服务器以获得一些数据,并且你的源代码库需要另一个数据(可能它甚至复制源代码而不是让CI服务器执行它)。在这种情况下,您只是在坐在世界某个地方的人与公司的源代码之间建立了直接联系。这也意味着,即使因为您花费大量时间来弥补所有潜在差距而难以穿透您的令人难以置信的安全服务,它们仍可能触发许多不必要的构建,并且如果您在Continuous Deployment中工作,甚至可以构建这些构建去生产(可能导致DOS攻击或服务中断)。如果某些时候某人确定脚本也需要从servlet中获取参数,那么您甚至会让黑客的生活更轻松,并最终可以让他访问您的系统。

我在前面的段落中所描述的可能与您的情况完全不相关,您可能正在开发一种服务,该服务将在您的家用计算机上运行,​​并且除了您自己以外不会对任何人感兴趣,但这并不改变这一事实是不好的设计(这可能是适合家庭使用的方式)。

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

+0

我无法理解你的答案。为什么servlet应该比Perl脚本更安全? – abierto

+3

这似乎更像是一个评论,而不是一个答案。 –

0

你试过Jsch它可以执行ssh并执行shell命令。