为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

侃侃尔雅 2022-05-12 16:44:29
我有一个运行 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";}
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

exec 进程的stdin可以通过proc.getOutputStream() 您通过此流发送的所有内容访问,将通过其stdin传递给 ssh-keygen 进程。

当然,如果您不发送它所期望的那种输入,该过程可能只是返回一些警告消息并继续等待。您需要发送的内容将在很大程度上取决于您将其发送到的过程。

另外:您正在通过读取 InputStream 和错误流来处理 ssh-keygen 的输出。但是,您可能希望在单独的线程中执行此操作 - 就像您现在拥有的那样,如果进程在写入 stdout 之前向 stderr 写入太多,它可能会因为缓冲区已满而挂起......


查看完整回答
反对 回复 2022-05-12
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信