【问题标题】:sshpass command not found when I run it in java在java中运行时找不到sshpass命令
【发布时间】:2019-10-22 07:05:48
【问题描述】:

我正在尝试运行一个命令以从远程地址内的文件中读取字符串(并且我确定该文件在那里),当我在 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 的行为空)并且我从代码中的记录器中收到以下错误:

Stderr: sh: 1: sshpass: not found

如果我在 bash 上使用完全相同的命令,它可以工作并打印我需要的字符串。

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

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

【问题讨论】:

  • 给出sshpass的完整路径
  • 考虑格式化命令rgagnon.com/javadetails/java-0463.html的字符串
  • 我尝试使用完整路径“/usr/local/bin/sshpass”而不是“sshpass”,但我仍然有同样的错误

标签: java bash shell sh sshpass


【解决方案1】:

我建议你不需要使用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 中。

【讨论】:

  • 起初,我正在尝试这种方法,但如果我不使用“sh”“-c”会引发异常
  • 我已经尝试过你的建议。如果没有双引号,我会收到以下错误消息:Stderr: Could not create directory '/usr/share/tomcat8/.ssh'. 使用双引号,String.format 与您描述的完全一样:Stderr: /bin/sh: 1: /usr/local/bin/sshpass -p password /usr/bin/ssh remote@192.168.1.10 'cat /home/ID/ID': not found
【解决方案2】:

使用 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());

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多