使用JSch在SSH服务器上搜索模式(使用less命令)

时间:2018-04-09 10:32:20

标签: java linux shell ssh jsch

我目前正在尝试访问Linux服务器并运行一些命令。 一般的想法是搜索包含某些文本的日志文件,然后访问该日志,搜索必需的文本并将当前显示在屏幕上的所有数据存储在一个字符串中。

这种方法在PuTTY中运行良好,但现在要求不同了。

我已经在其他命令(如ls)和其他提供直接输出的命令上完成了此任务。但是,我对lessmore等命令没有好运。

我当然试图将日志的全部内容发送到数组列表,然后搜索我的文本(看到一旦找到第一行,我将对数据的位置有一个相对的想法)。但是,由于日志大小从10 Mb到750 Mb不等,因此需要花费大量时间。

如果有人能够想到另一种方法,或者为这种方法提供可行的方法,我将不胜感激。

供参考: 代码我试过了

public class check {

private Session session;

private String username = "user";
private String password = "pass";
private String hostname = "host";

public SSHConnectionManager() 
{ }

public SSHConnectionManager(String hostname, String username, String password) 
{
    this.hostname = hostname;
    this.username = username;
    this.password = password;
}

public void open() throws JSchException 
{
    open(this.hostname, this.username, this.password);
}

public void open(String hostname, String username, String password) throws JSchException
{

    JSch jSch = new JSch();

    session = jSch.getSession(username, hostname, 22);
    Properties config = new Properties(); 
    config.put("StrictHostKeyChecking", "no");  // not recommended
    session.setConfig(config);
    session.setPassword(password);

    System.out.println("Connecting SSH to " + hostname + " - Please wait for few seconds... ");
    session.connect();
    System.out.println("Connected!");
}

public String runCommand(String command) throws JSchException, IOException 
{

    String ret = "";

    if (!session.isConnected())
        throw new RuntimeException("Not connected to an open session.  Call open() first!");

    ChannelExec channel = null;
    channel = (ChannelExec) session.openChannel("exec");

    channel.setCommand(command);
    channel.setInputStream(null);

    PrintStream out = new PrintStream(channel.getOutputStream());
    InputStream in = channel.getInputStream(); // channel.getInputStream();

    channel.connect();

    ret = getChannelOutput(channel, in);

    channel.disconnect();

    System.out.println("Finished sending commands!");

    return ret;
}


private String getChannelOutput(Channel channel, InputStream in) throws IOException
{

    byte[] buffer = new byte[1024];
    StringBuilder strBuilder = new StringBuilder();

    String line = "";
    while (true){
        while (in.available() > 0) {
            int i = in.read(buffer, 0, 1024);
            if (i < 0) {
                break;
            }
            strBuilder.append(new String(buffer, 0, i));
            System.out.println(line);
        }

        if(line.contains("logout")){
            break;
        }

        if (channel.isClosed()){
            break;
        }
        try {
            Thread.sleep(1000);
        } catch (Exception ee){}
    }

    return strBuilder.toString();   
}

public void close()
{        
    session.disconnect();
    System.out.println("Disconnected channel and session");
}


public static void main(String[] args)
{

    SSHConnectionManager ssh = new SSHConnectionManager();
    try {
        ssh.open();
        String ret = ssh.runCommand("ls -l");
        System.out.println(ret);
        ret=ssh.runCommand("cd *move to path of log*");
        System.out.println(ret);
        ret=ssh.runCommand("less *log name*");
        System.out.println(ret);
        ret=ssh.runCommand("/*searchtext*");
        System.out.println(ret);


        ssh.close();

        } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }
}

我得到了ls命令的necesaary输出,但没有其他任何输出。

1 个答案:

答案 0 :(得分:1)

首先,您的代码在其自己的单独shell中执行每个命令。因此cd命令对less命令没有影响。发送,/*searchtext*根本不是命令。请注意,setCommand不等同于在SSH控制台窗口中键入内容。这是完全不同的界面。

第一步是在同一个shell中执行所有命令。为此使用服务器的shell技术。在Linux服务器上,您将使用分号或双号和号。例如,此处显示:Multiple commands using JSch

虽然它不会帮助您/*searchtext*。你不应该试图使用&#34; human&#34;自动化技术。

最后,更好的解决方案是使用单个命令实际执行所有操作,例如使用grep

grep *searchtext* *move to path of log*/*log name*