我正在尝试用 Java 制作终端模拟器。java 程序将接受来自用户的命令,并将其输出显示给他们。我可以模拟像“ls”这样的简单命令,但我不知道如何处理像“cd”这样的命令。这是因为,我使用 exec() 方法来执行终端命令。因此,所有命令都在当前目录执行。'cd ..' 之类的命令被执行,但它们没有持久的效果,因为每个命令都是由 exec() 单独执行的。
任何想法我如何模拟整个会话?
3 回答
如果您正在使用 执行命令exec()
,那么您不是在编写终端仿真器;你正在写一个shell。在这种情况下,您将需要跟踪 shell 跟踪的内容,例如环境变量和工作目录。
如果您真的想编写终端仿真器,您将通过伪终端与 shell 进程对话。然后,您的程序将只跟踪终端跟踪的内容,例如线路状态和屏幕上显示的内容。
使用 Java 的伪终端会有点棘手,因为大多数文档都假设您使用的是 C api。 man pty
应该让你开始。您的 Java 进程必须使用 FileStream 对象打开伪终端的主端。我不确定Java中有没有办法让子进程打开伪终端的从属端;您可能必须调用一个 shell 命令exec()
来启动另一个 shell 命令,并将标准输入/输出/错误重定向到伪终端的从属端。
JSch 是 SSH2 的纯 Java 实现。JSch 允许你连接到一个 sshd 服务器并使用端口转发、X11 转发、文件传输等,你可以将它的功能集成到你自己的 Java 程序中。
您真的应该尝试一下 Ganymed。
Ganymed SSH-2 for Java 是一个在纯 Java 中实现 SSH-2 协议的库(在 J2SE 1.4.2 和 5.0 上测试)。它允许从 Java 程序中连接到 SSH 服务器。它支持 SSH 会话(远程命令执行和 shell 访问)、本地和远程端口转发、本地流转发、X11 转发、SCP 和 SFTP。
http://www.ganymed.ethz.ch/ssh2/
Ganymed 与 apache FTP 客户端一起,您还可以下载和上传文件。
Ganymed 中还有一个用于终端仿真的内置示例代码。
以下是使用 Ganymed 和 apache FTP 客户端完成的项目的链接。
编码快乐!!