Java 如何使用Ganymed SSH API更改目录(cd)?
这里我肯定遗漏了一些东西,但是如何使用Ganymed SSH API调用类似“cd/root/some/dir/”的东西呢Java 如何使用Ganymed SSH API更改目录(cd)?,java,session,ssh,cd,Java,Session,Ssh,Cd,这里我肯定遗漏了一些东西,但是如何使用Ganymed SSH API调用类似“cd/root/some/dir/”的东西呢 我创建了一个连接对象 在创建的第一个会话中,我调用了“cd/root/some/dir” 在创建的第二个会话中,我调用了“ls.”或“/myApp” 这不起作用,因为ganymed可能用自己的目录启动每个会话 那么我是否需要在同一个会话上执行这两个命令?比如: session.getStdin().write("cd /root/somedir \n".getBytes()
连接
对象session.getStdin().write("cd /root/somedir \n".getBytes());
session.getStdin().write("ls . ".getBytes());
这是正确的方法吗??如果是这样,为什么我们需要Session.execCommand?好的,我快速查看了Ganymed javadoc,虽然我自己没有尝试过,但我认为您应该使用Session的方法
execCommand()
,而不是写入STDIN。我非常确定会话连接到远程shell,因此处理shell状态,包括当前目录、环境变量等
因此,只需执行以下操作:
session.execCommand("cd /root/somedir \n".getBytes());
session.execCommand("ls . ".getBytes());
我希望这对你有用。祝你好运 在做了一些研究之后,我找到的唯一好的解决方案是在与“ls”命令相同的代码中调用“cd”命令,如下所示
session.execCommand("cd /root/somedir ; ls .");
分号将像在任何bash代码中一样分隔这两个命令
通过这种方式,您可以查询cd
和ls
命令的会话结果[session.getExitStatus()
],这比将这两个命令写入session.getStdIn()
要好得多(在写入stdin之后,您有点失去了检查退出状态的所有能力……)
希望这能帮助其他人
Eyal根据Ganymed常见问题解答(),每个生成的会话对象不允许发送多个命令。这就是SSH-2显然希望您处理它的方式。您的两个选项是组合这两个命令,如
session.execCommand("cd /root/somedir ; ls .");
然而,这并不总是有效的,如果你有多个命令,它会变得非常丑陋。另一种方法是打开一个交互式shell会话,并将命令写入standard in。这可能看起来像这样:
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
注意最后退出命令的使用。由于这被视为一个终端窗口,如果您不退出程序,读取服务器输出的任何循环将永远不会终止,因为服务器将需要更多输入我从未使用过此特定库,但您是否尝试获取一次STDIN,将其存储到变量中,然后使用它?Alex,恐怕这个问题没有现成的api解决方案。。。我已经反复浏览了几个星期的API。。。您建议的代码甚至不会编译,在修复它之后,将在Ganymed SSHThank的基本概念上失败。谢谢您的代码!帮我解决了一件我被难倒了一段时间的事情