从 Java 生成 SSH 密钥
Posted
技术标签:
【中文标题】从 Java 生成 SSH 密钥【英文标题】:Generating an SSH key from Java 【发布时间】:2019-06-11 22:53:40 【问题描述】:我有一个 Java 程序试图在 Linux 机器上运行 shell 命令,具体命令是生成 SSH 密钥。这些密钥不需要密码,所以我尝试使用ssh-keygen -t rsa -b 4096 -f my_key_name -P ""
运行它。我知道这个命令有效,因为我可以在命令行上运行它就好了。但是当我尝试使用下面的代码运行它时,它会显示passphrase is too short (minimum five characters)
。
我可以将下面的代码更改为:ssh-keygen -t rsa -b 4096 -f my_key_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";
【问题讨论】:
尝试将它作为命令数组传递(例如new String[] "ssh-keygen", "-t", "rsa", "-b", "4096", "-f", "my_key_name", "-P", ""
。在命令行中对""
的IIRC 解释是shell 的事情,这里不涉及shell;在命令数组中你会只需传递一个空字符串。
不一定与这个问题相关,但通常你应该更喜欢使用ProcessBuilder
来运行子进程而不是Runtime::exec
。 ProcessBuilder
提供了更多选项,并且通常更易于使用。
【参考方案1】:
我尝试通过运行传递包含该命令的文件的命令来创建它。我能够创建文件。 这是我的测试:
@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”的绝对路径,也可以获取它的相对路径。
【讨论】:
以上是关于从 Java 生成 SSH 密钥的主要内容,如果未能解决你的问题,请参考以下文章