【问题标题】:How do I change directory (cd) with Ganymed SSH API?如何使用 Ganymed SSH API 更改目录 (cd)?
【发布时间】:2018-04-18 04:22:39
【问题描述】:

我必须在这里遗漏一些东西,但是如何使用 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

【问题讨论】:

  • 我从未使用过这个特定的库,但您是否尝试过一次获取 STDIN,将其存储到变量中然后使用它?

标签: java session ssh cd


【解决方案1】:

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

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

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

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

希望这对其他人有所帮助

艾尔

【讨论】:

    【解决方案2】:

    根据 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
    

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

    【讨论】:

    • 感谢您提供此代码!帮助解决了我一段时间以来一直困扰的问题
    【解决方案3】:

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

    所以,只需执行以下操作:

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

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

    【讨论】:

    • Alex,恐怕这个问题没有现成的 api 解决方案......我已经来回使用 API 好几个星期了......你的代码建议甚至不会编译,并且在修复它之后,将在 Ganymed SSH 的基本概念上失败
    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2011-06-21
    • 2018-10-03
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多