从 Java 代码运行 Unix shell 脚本,并处理提示

我有一个运行 shell 命令的 Java 程序。一切正常,我可以查看命令是否有效或有错误...除了命令提示用户输入更多信息时。


例如,当我运行命令ssh-keygen -t rsa -b 4096 -f my_key_name时,程序将永远旋转而不返回给用户,因为它正在等待我输入密码。现在我知道我可以-P ""跳过我添加密码,但我的问题是其他提示信息的命令。


我只想知道如何将提示文本返回给用户(因为我并不真正需要用户输入他们对提示的响应的能力)。


RunCommandDto runCommandDto = new RunCommandDto();

Runtime rt = Runtime.getRuntime();

Process proc = rt.exec('ssh-keygen -t rsa -b 4096 -f my_key_name');


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";

}


侃侃尔雅
浏览 89回答 1
1回答

繁华开满天机

exec 进程的stdin可以通过proc.getOutputStream() 您通过此流发送的所有内容访问,将通过其stdin传递给 ssh-keygen 进程。当然,如果您不发送它所期望的那种输入,该过程可能只是返回一些警告消息并继续等待。您需要发送的内容将在很大程度上取决于您将其发送到的过程。另外:您正在通过读取 InputStream 和错误流来处理 ssh-keygen 的输出。但是,您可能希望在单独的线程中执行此操作 - 就像您现在拥有的那样,如果进程在写入 stdout 之前向 stderr 写入太多,它可能会因为缓冲区已满而挂起......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java