Java和SSH:维护连接

时间:2010-08-03 10:44:58

标签: java ssh

目标:具有一个连接和多个会话或一个持久会话的远程控制ssh服务器。

问题1:我目前使用sshj通过SSH进行远程控制,但它运行良好,但我似乎无法正确处理提示。 (主机不提供真正的root,只是sudo -i所以我需要先登录)。 问题2:我下载了ExpectJ以处理提示,但是我不能在我的生活中找出如何在登录并以root身份验证后维护会话。

当前的Hack解决方案要求我每次都重新登录:

public class Expect {
    Spawn shell;
    ExpectJ exp;
    String host;
    int port;
    String username;
    String passwd;
    boolean sudo = false;
    public Expect(String host,int port,String username,String passwd) throws IOException, TimeoutException, ExpectJException{

        exp = new ExpectJ(5);
        this.host = host;
        this.port = port;
        this.username = username;
        this.passwd = passwd;
        shell = exp.spawn(host, port, username, passwd);
        shell.send("sudo netstat -natvp  | grep Xtightvnc\n");
        System.out.println(shell.getCurrentStandardOutContents());
        try{
            shell.expect("[sudo] password for #######:");
            shell.send(passwd+"\n");
        }
        catch (IOException ex){
            String err = ex.toString();
            if(!err.equals("java.io.IOException: End of stream reached, no match found")){
                throw new IOException(ex);
            }
        }
    }

问题1:sshj可以用来“期待”密码提示吗?我找不到任何暗示这种控制的文件。

Quetsion 2:如何修改上述Expect代码以维持一个可以多次调用的持久连接?我希望能够在以root身份进入身份验证状态后继续进行交互,但是一旦发送了初始命令,Spawn将始终关闭。

1 个答案:

答案 0 :(得分:1)

  

问题1:sshj可以用来“期待”密码提示吗?我找不到任何暗示这种控制的文件。

主要是sshj提供的是shell或命令的I / O流的句柄,以及获取退出状态之类的东西的方法。

  

Quetsion 2:如何修改上述Expect代码以维持一个可以多次调用的持久连接?我希望能够在以root身份进入身份验证状态后继续进行交互,但是一旦发送了初始命令,Spawn将始终关闭。

支持多路复用会话,甚至支持单个SSH连接上的并发会话。但请注意,一个shell /命令/子系统只能有一个会话。

您使用的是哪种会话,即Session.Shell(通过session.startShell)或Session.Command(通过session.exec)?在后一种情况下,一旦执行完命令,会话意味着关闭,这是预期的行为。

通常情况下不会推荐Shell over Command,但是因为你配备了ExpectJ,我猜这可以处理提示等等,你可能想要走那条路。如果回显字符等问题,请使用PTY选项(而不是session.allocateDefaultPTY调用session.allocatePTY,它需要一大堆args,看看source for allocateDefaultPTY)。

代码示例:ShellCommand

此外,如果您将问题缩小到sshj的错误,请在问题跟踪器上报告:)