Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Ganymed SSH API更改目录(cd)?_Java_Session_Ssh_Cd - Fatal编程技术网

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

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()

这里我肯定遗漏了一些东西,但是如何使用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("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的基本概念上失败。谢谢您的代码!帮我解决了一件我被难倒了一段时间的事情