【问题标题】:Unable to call a shell script from Java where Shell contains sshpass无法从 Java 调用 Shell 脚本,其中 Shell 包含 sshpass
【发布时间】:2019-07-22 10:33:59
【问题描述】:

我们有一个用例将 > 4GB 的数据文件从 sftp 站点传输到服务器盒。我们决定创建一个 java 服务,该服务将调用一个 shell 脚本,实习生进入 sftp 站点和路径并将文件获取到目标目的地。

我们编写了以下代码来从 Java 文件调用 shell 脚本。

Process proc = null;
String command = "/mnt/hmdata/loadTest.sh";
System.out.println("passing command::" + command);
try {
    Runtime rt = Runtime.getRuntime();
    proc = rt.exec(command.trim());
    boolean status = proc.waitFor `enter code here` (45, TimeUnit.SECONDS);
    LOGGER.log(Level.INFO, "Shell Called successfully");
    if (status) {
        msg = "Shell Called successfully";

    } else {
        msg = "Error while calling Shell";
    }
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (NullPointerException e) { 
    e.printStackTrace(); 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} finally { 
    proc.destroy(); 
}

shell脚本是这样的

sshpass -p '<password>' scp -r <userid>@<host>:/finint/inbound/financial/tenv/edw_osccl/* .

一旦我调用我的 java 服务,我们的服务就无法启动 shell。相反,相同的外壳在服务器命令提示符下工作正常。我们正在从 Unix 运行我们的程序。

你能提出解决方案吗?

【问题讨论】:

  • shell 只包含以下命令 sshpass -p '' scp -r @:/finint/inbound/financial/tenv/edw_osccl/* .
  • 上面的代码是用独立的jar写的吗?你有任何例外吗?您在 msg 变量中获得的数据是什么?
  • 我们已将其公开为 REST Web 服务。 Java 部分存在于部署在 weblogic 12.2.1.1 中的 ear 文件中,并且在调用 shell 时我们没有遇到任何异常。等待 45 秒后,状态为布尔值“False”。
  • stackoverflow.com/questions/525212/… 试试看上面的问题和使用java执行shell的代码

标签: java shell unix weblogic12c


【解决方案1】:

已解决。 Java 代码没有变化。

   Changed Shell Script as
   echo "Hello" >> /mnt/hmdata/output.txt
   chmod 777 /mnt/hmdata/output.txt
   export PASSWD="password"

   sshpass -f /mnt/hmdata/password scp -v -r <user><host>:<path>/<file>

【讨论】:

    【解决方案2】:

    我认为命令应该是 sh /mnt/hmdata/loadTest.sh 而不是 /mnt/hmdata/loadTest.sh 以便您能够从您的 java 进程中使用它。 并且可以表示为String[],像这样:

    String[] cmd = { "sh", "/mnt/hmdata/loadTest.sh"};
    

    public Process exec(String command)public Process exec(String command, String[] envp, File dir) 的便捷方法,而public Process exec(String[] cmdarray, String[] envp, File dir) 又是public Process exec(String[] cmdarray, String[] envp, File dir) 的便捷方法,根据Javadoc

    如果您也可以共享 catch 块,那就太好了,这样我们就有了完整的 try-catch 块。

    【讨论】:

    • catch (IOException e) { e.printStackTrace(); } catch (NullPointerException e) { e.printStackTrace(); } 捕捉(异常前){ ex.printStackTrace(); } 最后 { proc.destroy(); }
    • String[] cmd = { "sh", "/mnt/hmdata/loadTest.sh"}; ---> 不工作
    • 运行java服务的用户是否有权限执行脚本?
    • 是的,它有 777 权限
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 2012-03-13
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多