如何从 Runtime.exec 创建的 cmd 会话写入 Unix 终端?

Posted

技术标签:

【中文标题】如何从 Runtime.exec 创建的 cmd 会话写入 Unix 终端?【英文标题】:How do you write to a Unix terminal from a cmd session created by Runtime.exec? 【发布时间】:2015-04-29 12:32:04 【问题描述】:

我在 java 中有一个 CmdProc 对象,它使用 Runtime.exec 创建的会话并处理 StdIn、StdOut 和错误流。它在 Linux、AIX 和 Windows 上运行良好。我可以发送大多数操作系统命令并处理结果,包括响应他们的提示。

但是,当我发送“su”命令时,它需要来自 TERMINAL 的输入,而不是来自 StdIn 的输入,因此我对其提示的响应将被忽略。

知道我是如何写出“似乎”来自终端的东西吗?

【问题讨论】:

是否使用带有 -S 命令的 sudo 选项? sudo -S 将从标准输入读取密码 感谢您的建议。不幸的是,这些是产品框,我用来运行 java 程序的用户 ID 不允许使用 sudo。如果可以,那么我可以 sudo su - newuser。另外,我希望将会话设置为新的用户 ID,而不仅仅是运行单个命令,因为在通用提交者的中间,将“sudo -S”预先附加到每个命令的代码可能会变得有点复杂。但绝对是一个有效的建议。谢谢。 如何为您的应用程序设置 +s 位自动赋予它超级用户权限? 再次感谢您的努力。不确定那个。我将应用程序作为“java -jar JarFile”运行。如果粘性位必须在 java.exe 上进行,我认为我们的 Unix 系统管理员不会喜欢这样吗?它可以在jar文件上工作吗? 你可以创建一个启动脚本,设置+x和+s,然后调用脚本而不是jave(脚本包含java -jar JarFile) 【参考方案1】:

再次感谢尼德霍格。 答案似乎是使用发送/期望。这确实意味着在盒子上进行特定的安装——我希望避免这种情况——但我可以即时创建期望脚本,将其存储在 /TMP 中,然后执行它,将解密的密码作为参数传递。然后再次删除脚本。它正在工作,所以也许我可以抽出时间深入研究发送/预期源代码(在 Tcl 中),看看是否有一些可以移植到 java 的终端处理。 感谢您的努力。

【讨论】:

以上是关于如何从 Runtime.exec 创建的 cmd 会话写入 Unix 终端?的主要内容,如果未能解决你的问题,请参考以下文章

Runtime.exec()

API--18--ProcessBuilder

如何通过在 java 中使用 Runtime.exec() 运行 sqlplus 来捕获 sqlplus 窗口的输出

无法通过Runtime.exec运行命令

使用 Runtime.exec 从 Java 应用程序启动 JVM 进程?

API--17--Process