我必须在这里遗漏一些东西,但是如何使用Ganymed SSH API调用类似“cd / root / some / dir /”的东西?
我创建了一个Connection
对象
在创建的第一个会话中,我调用了“cd / root / some / dir”
在创建的第二个会话中,我称之为“ls”。或“./myApp”
那没有用,因为ganymed可能会以自己的目录
开始每个会话那么我需要在同一个会话中执行这两个命令吗?类似的东西:
session.getStdin().write("cd /root/somedir \n".getBytes());
session.getStdin().write("ls . ".getBytes());
这是正确的方法吗?如果是这样,为什么我们需要Session.execCommand
?
答案 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());
我希望这对你有用。祝好运。