从Java生成SSH密钥

从Java生成SSH密钥,java,ssh-keys,ssh-keygen,Java,Ssh Keys,Ssh Keygen,我有一个Java程序,它试图在Linux机器上运行shell命令,具体的命令是生成SSH密钥。这些密钥不需要密码,所以我尝试使用ssh-keygen-t rsa-b4096-f my_key\u name-P”“运行它。我知道这个命令很有效,因为我可以在命令行上运行它。但当我尝试用下面的代码运行它时,它会说密码短语太短(至少五个字符) 我可以将下面的代码更改为:ssh-keygen-t rsa-b4096-f my_key\u name-p“foobar”,这在Java中确实可以正常工作,但我不

我有一个Java程序,它试图在Linux机器上运行shell命令,具体的命令是生成SSH密钥。这些密钥不需要密码,所以我尝试使用
ssh-keygen-t rsa-b4096-f my_key\u name-P”“
运行它。我知道这个命令很有效,因为我可以在命令行上运行它。但当我尝试用下面的代码运行它时,它会说
密码短语太短(至少五个字符)

我可以将下面的代码更改为:
ssh-keygen-t rsa-b4096-f my_key\u name-p“foobar”
,这在Java中确实可以正常工作,但我不需要密码

RunCommandDto runCommandDto = new RunCommandDto();
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec('ssh-keygen -t rsa -b 4096 -f my_key_name -P ""');

BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

String output = "";

while ((String sInOut = stdInput.readLine()) != null) {
    output += sInOut + "\n";
}

while ((String sErr = stdError.readLine()) != null) {
     output += sErr + "\n";
}

我试图通过运行命令来创建它,我在其中传递包含该命令的文件。我能够创建这个文件。 这是我的测试:

   @Test
   public void test() throws IOException {
      String output = "";
      String sInOut;
      String sErr;
      //      RunCommandDto runCommandDto = new RunCommandDto();

      String[] cmd = { "sh", "~/ssh_key_gen.sh"};

      Runtime rt = Runtime.getRuntime();
      Process proc = rt.exec( cmd );

      BufferedReader stdInput = new BufferedReader( new InputStreamReader( proc.getInputStream() ) );
      BufferedReader stdError = new BufferedReader( new InputStreamReader( proc.getErrorStream() ) );
      while ( (sInOut = stdInput.readLine()) != null ) {
         output += sInOut + "\n";
      }

      while ( (sErr = stdError.readLine()) != null ) {
         output += sErr + "\n";
      }

      System.out.println("if failed: " + output);
   }
包含该命令的我的文件如下所示:

#!/bin/bash
ssh-keygen -t rsa -b 4096 -f /tmp/sshkey -q -N ""

请注意:您可以获取文件“ssh\u key\u gen.sh”的绝对路径,也可以获取该文件的相对路径。

我尝试通过运行命令创建它,我正在其中传递包含该命令的文件。我能够创建这个文件。 这是我的测试:

   @Test
   public void test() throws IOException {
      String output = "";
      String sInOut;
      String sErr;
      //      RunCommandDto runCommandDto = new RunCommandDto();

      String[] cmd = { "sh", "~/ssh_key_gen.sh"};

      Runtime rt = Runtime.getRuntime();
      Process proc = rt.exec( cmd );

      BufferedReader stdInput = new BufferedReader( new InputStreamReader( proc.getInputStream() ) );
      BufferedReader stdError = new BufferedReader( new InputStreamReader( proc.getErrorStream() ) );
      while ( (sInOut = stdInput.readLine()) != null ) {
         output += sInOut + "\n";
      }

      while ( (sErr = stdError.readLine()) != null ) {
         output += sErr + "\n";
      }

      System.out.println("if failed: " + output);
   }
包含该命令的我的文件如下所示:

#!/bin/bash
ssh-keygen -t rsa -b 4096 -f /tmp/sshkey -q -N ""

请注意:您可以获取文件“ssh_key_gen.sh”的绝对路径,也可以获取文件的相对路径。

尝试将其作为命令数组传递(例如
新字符串[]{“ssh keygen”、“-t”、“-rsa”、“-b”、“4096”、“-f”、“my_key_name”、“-p”、“}
.IIRC解释
在您的命令行中是一个shell,这里不涉及shell;在命令数组中,您只需传递一个空字符串。这不一定与此问题有关,但一般来说,您应该更喜欢使用来运行子流程,而不是
运行时::exec
ProcessBuilder
公开更多选项,并且是通用的更容易使用。尝试将其作为命令数组传递(例如
新字符串[]{“ssh-keygen”、“-t”、“rsa”、“-b”、“4096”、“-f”、“我的密钥名”、“-P”、”}
。IIRC解释
在您的命令行中是一个shell,这里不涉及shell;在命令数组中,您只需传递一个空字符串。这不一定与此问题有关,但一般来说,您应该更喜欢使用来运行子流程,而不是
运行时::exec
ProcessBuilder
公开更多选项,并且是通用的很容易相处。