【问题标题】:Running Shell script on server在服务器上运行 Shell 脚本
【发布时间】:2012-06-28 08:08:57
【问题描述】:

我有一个在 Ubuntu 中运行 Shell 脚本(带参数)的独立应用程序。

ProcessBuilder pb1 = new ProcessBuilder("sh","deltapackage_app.sh","part_value","pathtofile"); 
Process process1 = pb1.start();

我正在通过 GUI 获取参数。 现在我想在 Web 应用程序中实现同样的事情,我可以从网页中获取输入并将其发送到服务器,然后服务器将执行带有参数的 shell 脚本。

任何人都可以建议我这样做的最佳方法。我应该用什么东西来做到这一点。

我知道我必须学习很多关于服务器的知识。或者我可以在基于浏览器的应用程序中使用相同的代码。

【问题讨论】:

  • 如果您允许用户向 shell 脚本提供参数,您应该注意安全性。普通/未引用/未转义的 shell 参数允许在命令行上执行进程,例如从互联网下载可执行文件...

标签: java web-services servlets servlet-3.0


【解决方案1】:

考虑以下代码行:

Process p = Runtime.getRuntime().exec("/bin/sh -c /bin/ls > ls.out");

这是为了执行 Bourne shell 并让 shell 执行 ls 命令,将 ls 的输出重定向到文件 ls.out。这 使用 /bin/sh 的原因是为了解决 stdout 的问题 由 Java 内部重定向。不幸的是,如果你尝试这个 什么都不会发生。当这个命令字符串被传递给 exec() 方法它将被分解成一个字符串数组,其中包含元素 是“/bin/sh”、“-c”、“/bin/ls”、“>”和“ls.out”。这会失败, 因为 sh 只希望“-c”开关有一个参数。做这个 工作尝试:

    String[] cmd = {"/bin/sh", "-c", "/bin/ls > out.dat"};
    Process p = Runtime.getRuntime().exec(cmd);

由于命令行已经是一串字符串,字符串 将简单地通过 exec() 方法加载到命令数组中,并且 按原样传递给新进程。因此外壳会看到一个“-c”和 命令“/bin/ls > ls.out”并正确执行。

http://www.ensta-paristech.fr/~diam/java/online/io/javazine.html

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 2014-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多