如何使用Ganymed SSH API更改目录(cd)?

时间:2011-10-02 16:15:14

标签: java session ssh cd

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

  1. 我创建了一个Connection对象

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

  3. 在创建的第二个会话中,我称之为“ls”。或“./myApp”

  4. 那没有用,因为ganymed可能会以自己的目录

    开始每个会话

    那么我需要在同一个会话中执行这两个命令吗?类似的东西:

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

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

3 个答案:

答案 0 :(得分:1)

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

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

分号将分隔两个命令,就像在任何bash代码中一样。

通过这种方式,您可以查询session.getExitStatus()cd命令的会话结果[ls],这些命令比更多更好,然后编写两个命令到session.getStdIn()(在写入stdin之后,你有点无法检查退出状态......)

希望这会有助于其他人

的Eyal

答案 1 :(得分:1)

根据Ganymed FAQ(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

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

答案 2 :(得分:0)

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

所以,请执行以下操作:

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

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