2

我必须在这里遗漏一些东西,但是如何使用 Ganymed SSH API 调用类似“cd /root/some/dir/”的东西?

  1. 我创建了一个Connection对象

  2. 在创建的第一个会话中,我调用了“cd /root/some/dir”

  3. 在创建的第二个会话中,我调用了“ls”。或“./myApp”

那没有用,因为 ganymed 可能会使用自己的目录开始每个会话

那么我需要在同一个会话中执行这两个命令吗?就像是:

session.getStdin().write("cd /root/somedir \n".getBytes());
session.getStdin().write("ls . ".getBytes());

这是正确的方法吗??如果是这样,我们为什么需要Session.execCommand

4

3 回答 3

1

在做了一些研究之后,我设法找到的唯一好的解决方案是在与“ls”命令相同的代码中调用“cd”命令,就像这样

session.execCommand("cd /root/somedir ; ls .");

分号将在任何 bash 代码中分隔这两个命令。

这样,您可以查询和命令的会话结果[ session.getExitStatus()] ,这比将两个命令写入要好得多 写入标准输入后,您有点失去了检查退出状态的所有能力......)cdlssession.getStdIn()

希望这将有助于其余的

埃亚尔

于 2011-10-04T16:51:37.727 回答
1

根据 Ganymed 常见问题解答 ( http://www.ganymed.ethz.ch/ssh2/FAQ.html ),您生成的每个 Session 对象不能发送多个命令。这就是 SSH-2 显然希望您处理它的方式。您的两个选项是结合两个命令,例如

session.execCommand("cd /root/somedir ; ls .");

但是,这并不总是有效,如果您有多个命令,它会变得非常难看。另一种方法是打开一个交互式 shell 会话并将命令写入标准输入。这可能看起来像这样:

Session sess = conn.openSession();
sess.requestDumbPTY();
sess.startShell();

OutputStream os = sess.getStdin();
os.write("cd /root/somedir\n".getBytes());
os.write("ls -1\n".getBytes());
os.write("exit\n".getBytes());

InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));

//TODO

注意最终退出命令的使用。由于这被视为终端窗口,因此如果您不退出程序,则读取服务器输出的任何循环将永远不会终止,因为服务器将期待更多输入

于 2018-04-17T20:22:39.987 回答
0

好的,我快速浏览了 Ganymed javadoc,虽然我自己没有尝试过,但我认为您应该使用execCommand()会话方法而不是写入 STDIN。我很确定会话已连接到远程 shell,因此可以处理 shell 状态,包括当前目录、环境变量等。

因此,只需执行以下操作:

session.execCommand("cd /root/somedir \n".getBytes());
session.execCommand("ls . ".getBytes());

我希望这对你有用。祝你好运。

于 2011-10-02T16:48:14.217 回答