Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Servlet/JSP调用unixshell命令_Java_Perl_Servlets_Sh - Fatal编程技术网

Java 从Servlet/JSP调用unixshell命令

Java 从Servlet/JSP调用unixshell命令,java,perl,servlets,sh,Java,Perl,Servlets,Sh,我需要从Servlet调用一些Unix命令。 我有一些Perl脚本,但我想把它们“翻译”成Java。 下面是我想在Java上做的事情,但我已经用Perl做了: system("myfolder/myscript.sh > /myfolder/logs/myscript.log"); 可以在Servlet上执行此操作吗?简短回答: 这是可能的,但它的设计很糟糕,可能会带来安全风险。 最好以某种方式标记脚本需要运行,并通过脚本检查标记 长答案(在注释之后): servlet通常用于为某些内容

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

system("myfolder/myscript.sh > /myfolder/logs/myscript.log");
可以在Servlet上执行此操作吗?

简短回答:

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

长答案(在注释之后):

servlet通常用于为某些内容提供用户界面(或api),例如访问数据或触发操作。因此,它们意味着可以从远程资源(如远程计算机)进行访问。在某些(实际上是大多数)情况下,远程计算机甚至可能脱离网络,例如某人的家

每台暴露于外部世界的服务器都有可能以某种方式遭到黑客或攻击,其风险与该资源引起的兴趣程度直接相关

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

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


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

您是否尝试过。它可以执行ssh和shell命令。

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

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

我不明白你的答案。为什么servlet不如Perl脚本安全?这看起来更像是一个注释而不是答案。您选择在这里使用Process而不是ProcessBuilder的原因是什么?