在Java中运行时找不到sshpass命令

时间:2019-06-06 18:16:07

标签: java bash shell sh sshpass

我正在尝试运行命令以从远程地址中的文件中读取字符串(并且我确定该文件在那里),当我在bash上运行该命令时该命令有效,但在以下情况下该命令不起作用我在Java代码中运行它。

    Runtime rt = Runtime.getRuntime();
    String[] command;
    String line;

    try {
        command = new String[] {"sh", "-c", "\"sshpass " + "-p " + password + " ssh " + user + "@" + ip + " 'cat " + file.getAbsolutePath() + "'\"" };

        Process mountProcess = rt.exec(command);

        mountProcess.waitFor();

        bufferedReader = new BufferedReader(new InputStreamReader(mountProcess.getInputStream()));
        while ((line = bufferedReader.readLine()) != null) {
            user_list.put(user, line);
        }
        bufferedReader.close();

        bufferedReader = new BufferedReader(new InputStreamReader(mountProcess.getErrorStream()));
        while ((line = bufferedReader.readLine()) != null) {
            LOGGER.debug("Stderr: " + line);
        }
        bufferedReader.close();
    } catch ...

没有任何行添加到我的user_list中(因此,来自getInputStream的行为null),并且我从记录器中的代码中收到以下错误:

Stderr: sh: 1: sshpass: not found

如果我在bash上使用完全相同的命令,它将起作用,并且会打印我需要的字符串。

sshpass -p password ssh remote@192.168.1.10 'cat /home/ID/ID'

有人知道为什么会这样吗?谢谢!

2 个答案:

答案 0 :(得分:2)

我建议您不需要使用sh来包装命令。试试

command = new String[] {"sshpass", "-p", password, "ssh", user + "@" + ip, "cat " + file.getAbsolutePath() };

如果您需要使用sh,请从命令字符串中删除转义的双引号:您将其作为文字字符发送:

command = new String[] {
    "sh", 
    "-c", 
    String.format("sshpass -p %s ssh %s@%s 'cat %s'", password, user, ip, file.getAbsolutionPath())
};

如果您仍然 收到“找不到命令”,则需要指定sshpass的完整路径,或确保其目录位于您的PATH中。

答案 1 :(得分:0)

使用Java执行此命令时,用户是tomcat8而不是root(在bash终端中使用时)

对我有用的解决方案包括一些标志:

String.format("/usr/local/bin/sshpass -p %s /usr/bin/ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no %s@%s 'cat %s'", password, user, ip, file.getAbsolutePath());