我正在尝试用Java创建终端模拟器。 java程序将接受来自用户的命令,并向其显示其输出。我可以模仿像'ls'这样的简单命令,但我不知道如何处理像'cd'这样的命令。这是因为我使用exec()方法执行终端命令。因此,所有命令都在当前目录中执行。执行'cd ..'之类的命令,但是它们没有持久效果,因为每个命令都由exec()单独执行。
任何想法如何模仿整个会话?
答案 0 :(得分:5)
如果使用exec()
执行命令,则表示您没有编写终端仿真器;你正在写一个shell。在这种情况下,您需要跟踪shell跟踪的内容,例如环境变量和工作目录。
如果你真的想写一个终端模拟器,你将通过伪终端与shell进程交谈。然后你的程序就会跟踪终端跟踪的事情,比如线路状态和屏幕上显示的内容。
使用Java中的伪终端会有点棘手,因为大多数文档假设您使用的是C api。 man pty
应该让你入门。您的Java进程必须使用FileStream对象打开伪终端的主端。我不确定在Java中是否有办法让子进程打开伪终端的从属端;您可能必须调用带有exec()
的shell命令,该命令启动另一个shell命令,标准输入/输出/错误重定向到伪终端的从属端。
答案 1 :(得分:2)
JSch是SSH2的纯Java实现。 JSch允许您连接到sshd服务器并使用端口转发,X11转发,文件传输等,您可以将其功能集成到您自己的Java程序中。
答案 2 :(得分:0)
你应该试试Ganymed。
Ganymed SSH-2 for Java是一个实现SSH-2的库 纯Java中的协议(在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客户端进行项目的链接。
快乐编码!!