繁体   English   中英

Java:从终端读取输入提示

[英]Java: read input prompt from terminal

我正在用Java创建一个在Linux中运行ssh-keygen的进程。 该实用程序通常从终端接收用户输入,因此我需要从Java程序中发送响应。 这是相关代码,在此问题的帮助下创建的:

// Create a process to run ssh-keygen.
ProcessBuilder procBuilder = new ProcessBuilder("ssh-keygen", "-t", "rsa");
// Redirect errors to the process' standard output.
procBuilder.redirectErrorStream(true);
Process proc = procBuilder.start();

Scanner fromProc = new Scanner(new InputStreamReader(proc.getInputStream()));
OutputStream toProc = proc.getOutputStream();

// While there is another line of output from the process. GETS STUCK HERE.
while (fromProc.hasNextLine()) {
    String message = fromProc.nextLine();
    // If the process asks to overwrite existing keys.
    if (message.startsWith("Overwrite (y/n)?") == true) {
        // Send response to overwrite RSA keys.
        toProc.write("y\n".getBytes());
        toProc.flush();
    }
    // If the message asks to enter a passphrase or specify a file.
    else if (message.startsWith("Enter")) {
        // Send response to use the default.
        toProc.write("\n".getBytes());
        toProc.flush();
    }
}

现在要解决这个问题,以及为什么我先前提到的问题没有得到解决。 当ssh-keygen要求用户输入时,这似乎卡在fromProc.hasNextLine()上。 我怀疑这是因为要求用户输入的行没有以换行符结尾(因为直接在终端中键入的响应将出现在与提示相同的行上)。

所以这是我的问题。 如果提示行不以换行符结尾,该如何阅读? 我在想也许可以将fromProc.useDelimiter()与换行符结合使用,但是我不确定是什么原因,因为提示往往以空格结尾。

或者,可以使用bash脚本更轻松地完成此操作吗? 不幸的是,我对bash的经验很少,并且我不确定当ssh-keygen的提示每次可能不同时是否可以模拟用户输入。 我在这里使用的Java代码旨在具有灵活性,因为它仅对某些提示(如果出现)进行响应。

免责声明:这只会在具有非常特定的系统详细信息的已知机器上运行。 它实际上是嵌入式代码,因此我不必担心可移植性。

要扫描没有行尾的短语,您可能应该使用Scanner.findInLine

但是,我认为您的麻烦不会到此为止。 ssh-keygen将一些提示输出到与其关联的tty(并希望从那里得到答案),而不是标准输出和标准输入。 实际上,出于好奇,我刚刚对其进行了测试,它针对标准错误给出了一个提示,针对标准输出给出了一个提示,然后针对tty提供了下一个提示。

为什么不避免所有这些,而是​​将文件名,密码短语和所有这些参数作为参数传递给ssh-keygen命令?

您可以在此答案中看到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM