JSCH顺序执行并打印命令输出

时间:2016-02-21 14:39:17

标签: java ssh jsch

在shell模式下的Jsch我想按顺序执行命令。我尝试使用以下代码。代码问题是代码在readLine()上等待。任何人都可以提出解决方案。如果可以,请修改以下代码

注意:我想只在shell模式下执行命令

public class SSHClient1 {

    private  Session session;
    private  ChannelShell channel;
    private  String username = "";
    private  String password = "";
    private  String hostname = "";

    public SSHClient1(String username, String password, String hostname) throws Exception {
        super();
        this.username = username;
        this.password = password;
        this.hostname = hostname;
        startSession();
        intializeChannel();
    }

    private void startSession() throws Exception{
        if(session == null || !session.isConnected()){
            session = connect(hostname,username,password);
        }
    }

    private void intializeChannel() throws Exception{
        if(channel == null || !channel.isConnected()){
            try{
                channel = (ChannelShell)session.openChannel("shell");
                channel.setPty(false);
                channel.connect();
            }catch(Exception e){
            }
        }
    }

    private Session connect(String hostname, String username, String password) throws Exception{
        JSch jSch = new JSch();
        try {
            session = jSch.getSession(username, hostname, 22);
            Properties config = new Properties(); 
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.setPassword(password);
            session.connect();
            System.out.println("Connected successfully to host "+ hostname);
        }catch(Exception e){
        }
        return session;
    }

    public void executeCommands(List<String> commands) throws Exception{
        PrintStream out = null;
        try{
            out = new PrintStream(channel.getOutputStream());
            for(String command : commands){
                out.println(command);
                out.flush();
                printResult();
            }

        }catch(Exception e){
        } finally{
            if(out != null)
                out.close();

        }
    }

    private void printResult() throws IOException{
        try{
            InputStream in = channel.getInputStream();
            String line = "";
            BufferedReader br =new  BufferedReader(new InputStreamReader(in));
            while((line = br.readLine()) != null){
                System.out.println(line);
            }
        }catch(Exception e){
        }

    }


    public void close(){ 
        if(channel != null)
            channel.disconnect();
        if(session != null)
            session.disconnect();
    }


    public static void main(String[] args) throws Exception{

        SSHClient1 ssh = new SSHClient1("admin", "password", "192.168.2.9");
        List<String> commands = new ArrayList<String>();
        commands.add("enable");
        commands.add("configure terminal");
        commands.add("show running-config");
        ssh.executeCommands(commands);
        ssh.close();

    }
}

如果我改变上面代码的两个方法我能够实现我想要的,那个方法的问题是我需要在创建缓冲区之后放一个Thread.sleep,否则它将不会打印任何东西。

public void executeCommands(List<String> commands) throws Exception{
        PrintStream out = null;
        try{
            out = new PrintStream(channel.getOutputStream(),true);
            for(String command : commands){
                out.println(command);
                out.flush();
                printResult();
            }
        }catch(Exception e){
        } finally{
            if(out != null)
                out.close();

        }
    }

    private void printResult() throws IOException{
        try{
            InputStream in = channel.getInputStream();
            BufferedReader br =new  BufferedReader(new InputStreamReader(in));
            Thread.sleep(10000);
            boolean ready = false;
            int c = 0;
            StringBuilder line = new StringBuilder();
            while((ready = br.ready()) == true){
                ready = br.ready();
                c = br.read();
                System.out.print(String.valueOf((char)c));
            }
        }catch(Exception e){
        }
    }

2 个答案:

答案 0 :(得分:1)

如果包装命令是一个选项,你可以这样做:

# cat /usr/bin/your-enable
#!/bin/bash
enable
echo "#END#"

更改主要(示例):

 commands.add("/usr/bin/your-enable");

更改printResult:

while((line = br.readLine()) != null){

    if (line.equals("#END#")) {
       break;
    } else {
       System.out.println(line);
    }
}

希望它有所帮助。

答案 1 :(得分:0)

能够找到解决方案。在br.ready()为真之前已经进行了一次忙碌的旋转。我们还需要在放置忙循环之前放置一个Thread.sleep